剛看了http://www.cnblogs.com/helloj2ee/archive/2009/05/29/1491822.html上"關於WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(個人認為還是相當全面的)"
,寫的真是不錯!但是也不能保證他寫的都對,我下面以我自己的理解寫的讀後感,有參考他,還有M$自己的解釋,雖然不一定都對,但是不理解的我也得先找個理由解釋解釋,否則心裡不踏實。
讀後感:
Z-Order:
windows視窗的排列順序使用的是稱之為Z序的相片順序Z-Order。螢幕一般以x軸y軸來表示位置,而以z軸來表示前後位置,x軸從左指向右,y軸從上指向下,z軸從螢幕內指向外。預設Z-Order的值越大,在螢幕上顯示時會越靠上放。系統維護了一個z序列表來管理所有視窗的顯示。
當開啟一個視窗時,系統會將它顯示到所有視窗的上面(不管z-order值的大小,唯一例外就是擁有top-most的視窗),所以我們能看到開啟的視窗。當使用者啟用另外的視窗時,系統會改變失去和獲得焦點的兩個視窗的z-oder值,該值當然與z序列表同步。所以我們又能看到獲得焦點的那個視窗把失去焦點的那個視窗蓋住。在程式中可以調用BringWindowToTop,SetWindowPos 和 DeferWindowPos動態改變視窗的z-order值。
特別的,子視窗與父視窗的z-order值是一樣的(我感覺是這樣理解),比如拿對話方塊來說,它與其內的子控制項的z-oder值是一樣的,這樣能保證對話方塊顯示時子控制項也跟著顯示出來,它們其實是綁到一塊啦。而子控制項之間就依tab-order區分,tab-order值大的控制項同位置上會覆蓋值小的控制項(除非加了WS_CLIPSIBLINGS樣式),而作為對話方塊這個組件容器來講預設它會覆蓋其內的所有子組件(除非加了WS_CLIPCHILDREN樣式),就好像它的tab-order值比任何其內的自組件都大!
WS_CLIPCHILDREN、WS_CLIPSIBLINGS:
雖然區分開父視窗和子視窗,但是子視窗其實就是畫在了父視窗客戶區上(你也可以理解為重疊了),因為預設父視窗總是覆蓋了子視窗,所以重疊部分父視窗會先幫忙繪製,然後子視窗自己再繪製。如果父視窗具有WS_CLIPCHILDREN樣式,那意味著父視窗不幫忙畫了,只子視窗自己繪製那個重疊區。它那個“圖 3‑3 ”之所以會顯示成那樣是因為,當對話方塊視窗獲得焦點時,因為它具有WS_CLIPCHILDREN樣式,所以static控制項它自己負責畫自己,但是如果整個static的客戶區它並不是都在畫(它代碼中是這樣了,只畫了客戶區的4個邊,還就是些了一個hello字),那麼它自己也沒畫到的地方就沒人畫,所以只能透明了,於是我們就看到了對話方塊下面的視窗客戶區上的內容。如果static控制項負責到底把自己的客戶區畫滿,也就沒有透明這個問題了。子控制項間的覆蓋也是同樣的道理。所以WS_CLIPCHILDREN、WS_CLIPSIBLINGS這兩個樣式道理是一樣啦,只不過作用對象不同(父子間還是兄弟間)。
參考:http://msdn.microsoft.com/en-us/library/ms632599(v=vs.85).aspx之#Clipping錨點和#zorder錨點