|
我是個喜歡瞎琢磨的人。尤其是這幾天心情非常郁悶。于是開始琢磨了…….琢磨的問題就是WS_CLIPCHILDREN和WS_CLIPSIBLINGS兩種窗口樣式的理解。
1.求助MSDN 我的第一步當(dāng)然是求助MSDN。在MSDN里面有詳細的解釋。 1.1 WS_CLIPCHILDREN WS_CLIPCHILDREN樣式從字面上可以理解成ClipChildren,裁減子窗口。 MSDN里的E文解釋:Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window. 讀E文是一件困難的事,為了不讓大家再重復(fù)我的痛苦,我就越俎代庖翻譯一下:WS_CLIPCHILDREN樣式主要是用于父窗口,也就是說當(dāng)在父窗口繪制的時候,父窗口上還有一個子窗口,那么設(shè)置了這個樣式的話,子窗口區(qū)域父窗口就不負責(zé)繪制。 那么按照MSDN的理解,可以用下面這幅圖來表示: 圖 1?1 WS_CLIPCHILDREN樣式的初理解 1.1 WS_CLIPSIBLINGS WS_CLIPSIBLINGS樣式從字面上可以理解成ClipSiblings,裁減兄弟窗口。 MSDN里的E文解釋:Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
圖 1?2 WS_CLIPSIBLINGS樣式的初理解 2.求助Google 最初看完MSDN,說實話,沒有像現(xiàn)在這么清晰畫出上面兩幅圖。而是一片茫然。Google上我所搜索到的中文的還算是比較好的一篇,應(yīng)該是這篇:http://blog.163.com/sandylin_wind/blog/static/935500552008105104617806/ 大家可以看看,但是確實我覺得還不夠詳細,因此才會寫篇博文,討論一下這個問題。 當(dāng)然E文的專注于WS_CLIPCHILDREN和WS_CLIPSIBLINGS討論的也比較少??赡芾贤庥捎诙瓻文,所以不像我們這樣費事。 經(jīng)過一番搜索,仍然有一些比較重要的結(jié)論,列舉如下: (1)所有的overlapped和popup風(fēng)格的窗口,都有WS_CLIPSIBLINGS 屬性。也就是說這類風(fēng)格的窗口,你是去不掉WS_CLIPSIBLINGS 屬性的,不會在它重疊的兄弟窗口繪圖; ?。?)更進一步說明,WS_CLIPSIBLINGS只是用于子窗口(For use with the WS_CHILD style only.) 當(dāng)然在Google上搜索,通常會有意外發(fā)現(xiàn),一般和這個主題相關(guān)的往往是控件如何透明的問題。這里也給大家?guī)讉€關(guān)于控件透明的討論。 ?。?) http://www./articles/transparent_static.html這個是關(guān)于控件上面文本透明的例子。 3.做幾個實驗 3.1 驗證 WS_CLIPCHILDREN 簡單到什么程度呢?只需要在對話框的屬性打個勾而已。 簡單到什么程度呢?只需要在對話框的屬性打個勾而已。
圖 3?1 如何設(shè)置對話框Clip Children屬性 我們先做做第一個程序,這個程序唯一有點難的地方就在于需要繼承一下CStatic類,然后重載一下OnPaint函數(shù)。
圖 3?2 效果圖 當(dāng)設(shè)置了Clip children屬性的時候,接下來是見證奇跡的時刻 。^_^ 圖 3?3 效果圖 很明顯父窗口沒有管子窗口的背景色如何繪制。子窗口的背景只是當(dāng)時桌面上現(xiàn)有的窗口內(nèi)容。 3.2 驗證WS_CLIPSIBLINGS 當(dāng)?shù)谝粋€實驗成功之后,我原以為WS_CLIPSIBLINGS也會相當(dāng)?shù)睾唵?。結(jié)果我花費了大量的時間糾纏在這個問題上。首先遇到的第一個問題,當(dāng)然是動態(tài)地改樣式,這個并不是太復(fù)雜的問題。如何動態(tài)改樣式,見下面的代碼:
然后,我在對話框上添加了一個圖片控件和一個自繪制的控件(和上例類似,為了效果明顯,我對自繪的控件進行了填充) 按照我預(yù)先設(shè)想的效果,理想的情況應(yīng)該如下:
發(fā)現(xiàn)結(jié)果很混亂,每回都得不到我想要的,具有隨機性。甚至有的時候按照我的預(yù)想,有的時候則完全不管我的心情。哪怕我氣的吹胡子瞪眼睛,也是枉然。 最常見的是這樣一種情況,就是無論我設(shè)置不設(shè)置WS_CLIPSIBLINGS屬性,當(dāng)點擊重繪圖片控件的時候(m_pic.Invalidate()),效果都一如既往,先開始圖片控件(pic)被自定義控件(custom)壓蓋,然后重繪之后,圖片控件(pic)壓蓋自定義控件(custom)。 圖 3?5 一種錯誤圖 經(jīng)過一段時間的郁悶,我最終找到了問題之所在,是這樣的一個結(jié)論:WS_CLIPSIBLINGS還和控件的疊加順序有關(guān)。疊加順序如果不對,你無法查看WS_CLIPSIBLINGS的效果。就上面的問題,我們可以在VC編輯器里查看到控件的疊加順序。
圖 3?6控件的Tab順序 Pic控件是在custom控件的下方。(Tab Order和Z Order順序是一致的)。這樣配置不配置 WS_CLIPSIBLINGS都不能看出效果。 但是改動控件的壓蓋順序,令pic控件壓蓋在custom控件之上(實際上是改動 Tab order順序) ![]() 圖 3?7 控件的Tab順序
這樣就會出現(xiàn)預(yù)期的效果。當(dāng)不配置 WS_CLIPSIBLINGS,pic控件會壓蓋custom控件,而當(dāng)配置了該屬性,則pic控件不會壓蓋custom控件,重疊的區(qū)域由custom控件自己制作。 ![]() 圖片看不清楚?請點擊這里查看原圖(大圖)。 圖 3?8 預(yù)期的效果 4.結(jié)論
好,到此為止,應(yīng)該說點有結(jié)論的話了。 ?。?)WS_CLIPCHILDREN樣式主要是用于父窗口,也就是說當(dāng)在父窗口繪制的時候,父窗口上還有一個子窗口,那么設(shè)置了這個樣式的話,子窗口區(qū)域父窗口就不負責(zé)繪制。 ?。?)所有的overlapped和popup風(fēng)格的窗口,都有WS_CLIPSIBLINGS 屬性。也就是說這類風(fēng)格的窗口,你是去不掉WS_CLIPSIBLINGS 屬性的,不會在它重疊的兄弟窗口繪圖; ?。?)更進一步說明,WS_CLIPSIBLINGS只是用于子窗口(For use with the WS_CHILD style only.) ?。?)WS_CLIPSIBLINGS實際上還需要和控件的疊放順序(z order)配合使用,才能看出明顯的效果。 |
|
|