WM PAINT 父子視窗間

2021-06-17 23:25:59 字數 1897 閱讀 2661

wm_paint(父子視窗間)

視窗控制代碼(hwnd)都是由作業系統核心管理的,系統內部有乙個z

-order序列,記錄著當前從螢幕底部(假象的從螢幕到眼睛的方向),到螢幕最高層的乙個視窗控制代碼的排序,這個排序不關注父視窗還是子視窗。

當任意乙個視窗接受到wm_paint訊息產生重繪,更新區繪製完成以後,就搜尋它的前面的乙個視窗,如果此視窗的範圍和更新區有交集,就向這個傳送wm_paint訊息,周而復始,直到執行到頂層視窗。才算完成。

對於乙個對話方塊(主視窗來說,設定了ws_clipchildren樣式時,其所有子視窗都在他的前面——也就是更靠近眼睛的位置),所以主視窗接受wm_paint繪製完成後,會引起更新區上所有子視窗的重繪(所有子視窗也是從底到外排序的)。

只要有更新區域的產生.

無所謂誰管,每個視窗都是對等的,都有自己的訊息相應函式,只不過屬性不同。

邏輯上可以這麼理解,但其實,作業系統是按主視窗排序,然後乙個主視窗的所有子視窗是等級的,它們再乙個排序。所以邏輯上可以說,系統中所有視窗控制代碼都有個排序。

子視窗無效不會引起父視窗重繪,父視窗無效,如果父視窗(沒有ws_clipchildren屬性)收到wm_paint,則所有子視窗都會在父視窗處理wm_paint之後收到wm_paint重繪訊息,當然,如果父視窗帶有屬性ws_clipchildren,則不會引起子視窗重繪 

子視窗更新區域

子視窗是具有ws_child或者ws_childwindow樣式的視窗。和一般視窗一樣,子視窗通過wm_paint來繪圖。子視窗也維護乙個更新區域,應用程式和系統都可以通過設定該更新區域來產生wm_paint訊息。

子視窗的更新和顯示區域受到父視窗的影響,其他樣式的視窗則不會。系統常常設定父視窗的更新區域的同時設定子視窗的更新區域,使父視窗收到wm_paint訊息的同時子視窗也能收到wm_paint訊息。系統把子視窗的位置限制在父視窗的client區域,超出這個區域就會被裁減掉。

無論何時,只要父視窗的更新區域包含了子視窗的一部分,系統就會為子視窗設定更新區域。此時,系統先向父視窗傳送wm_paint訊息,然後向子視窗傳送訊息讓子視窗可以恢復被父視窗覆蓋的內容。

但是如果只有子視窗設定了更新區域,系統不會給父視窗也設定。在無效化子視窗時,系統不會給父視窗發wm_paint(因為被覆蓋住了,根本沒有必要)。同樣的,如果使被子視窗覆蓋住的父視窗的部分無效化,系統也不會給父視窗傳送wm_paint的。在這種情況下,無論子視窗還是父視窗都不會收到wm_paint訊息。

應用程式如果設定了ws_clipchildren這個樣式的話,當父視窗的更新區域被設定的時候,子視窗的更新區域不會被設定。父視窗作用在子視窗下面的任何繪圖全部被裁減掉。

子視窗的更新和可視區域也受到兄弟視窗的影響。如果兩個視窗重疊,則兩個視窗都會收到wm_paint訊息。他們受到wm_paint訊息的順序與z

-index相反,即最上面的(z

-order最高)的收到wm_paint訊息最晚。

應用程式可以設定ws_clipsibling來避免兄弟視窗的繪製重疊。設定了這個,高z

-order的視窗部分就被下面的視窗裁減掉了。

父視窗先收到wm_paint,先繪製父視窗,然後再重新整理子視窗

ws_clipchildren是來設定父視窗的屬性的,設定以後,父視窗重新整理的時候不再自動去重新整理子視窗的區域,需要你自己去重新整理子控制項區域

ws_clipchildren

好,到此為止,應該說點有結論的話了。(1

)ws_clipchildren樣式主要是用於父視窗,也就是說當在父視窗繪製的時候,父視窗上還有乙個子視窗,那麼設定了這個樣式的話,子視窗區域父視窗就不負責繪製。(2

3)更進一步說明,ws_clipsiblings只是用於子視窗(for use with the ws_child style only.)(4

)ws_clipsiblings實際上還需要和控制項的疊放順序(z order)配合使用,才能看出明顯的效果。

模式對話方塊父子視窗間的通訊

本文主要對防止模式對話方塊彈出新子視窗,和父子視窗間的通訊進行介紹。比如,如下 是子視窗 模式視窗 的jsp中的js function test key 是jsp頁面中某標籤的id,比如其可以是,其中value1是action中的某個返回屬性,當value1 true時,子視窗就向父視窗返回true...

js open視窗父子視窗操作

js open視窗父子視窗操作 父視窗js function opencrawlpage function openprocpage function setopencallback data 子視窗js 關鍵 opener 意思是開啟的人,也就是彈出這個視窗的頁面 這個object用法,前不加wi...

iframe 父子視窗呼叫

順序 window document body 元素 1.子iframe中呼叫父中方法 window.parent.或者 parent.2.父呼叫子iframe 方法 iframesrc index2.html scrolling no name iframename id ifrid iframe...