VC編程之VC實現頂層窗口的透明與實現子窗口的透明

本文主要向大家介紹了VC編程之VC實現頂層窗口的透明與實現子窗口的透明,通過具體的內容向大家展示,希望對大家學習VC編程有所幫助。

本人在vc開發過程中,多次因窗口透明而煞費苦心,在本人的前一文章《UpdateLayeredWindow與SetLayeredWindowAttributes》中已經指明實現窗口的透明方法,在過往實際的開發過程中我也一直沿襲這一做法,但也並不是屢試不爽,實際應用過程中的缺陷暴露如下:

(1)SetLayeredWindowAttributes和UpdateLayeredWindow兩個API函數只能適用於層級窗口,也就是非子窗口;

(2)UpdateLayeredWindow方法效率比SetLayeredWindowAttributes效率高,但是它是通過繪製到某一個內存中間設備上下文後,將設備上下文拷貝到指定層級窗口上實現的,也就是所有的繪製都必須在內存設備上下文實現,甚至包括所有子控件,所以通過它實現透明,父窗口上的所有子控件“不見了”,所以應特別注意[這也是經驗總結,切記!],但好處是指定不透明度爲255時候,它自動從使用的png的alpha[當然不一定是png貼圖,只要貼圖有alpha通道]通道去透明窗口,也就是透明度就是圖片的透明度,否則不使用貼圖情況當然可以使用const

透明常亮指定透明度;SetLayeredWindowAttributes透明也有兩種方式,第一種是通過指定COLORREF crKey,

掩碼色,也就是參數2指定爲要剔除的掩碼色【窗口自動將所有背景中爲crkey的掩碼色的背景完全透明】,當然使用掩碼色方法的時候必須指定 DWORD dwFlags爲LWA_COLORKEY,即使用掩碼色透明;第二種方式就是不使用掩碼色,而是使用透明度去透明而不關心你背景顏色到底如何,只是將整個窗口加上一層透明度,這時crkey忽略填寫0,將bAlpha不透明度指定成0-255的任意值,0指完全透明,255指完全不透明,此時指定 DWORD dwFlags爲LWA_ALPHA.

BOOL SetLayeredWindowAttributes(

HWND hwnd,

COLORREF crKey,

BYTE bAlpha,

DWORD dwFlags

);通過對比可以知道SetLayeredWindowAttributes中第一種透明方法是逐個去掉掩碼色位置的像素,而UpdateLayeredWindow是通過二進制與操作實現的,所以UpdateLayeredWindow效率要高很多很多;

(3)由於是層級窗口,在實際應用中將透明窗口都設置爲透明窗口導致的問題是,切換到其他頁面的時候,必須手動去隱藏改層級窗口,如果手動SetParent這層級窗口就失效,調用後自動帶上WS_CHILD屬性導致層級窗口透明無法實現;

(4)最小化後再顯示,透明窗口顯示比其他窗口快,感覺覆蓋在其他窗口上的透明窗口“不是一夥的”,失聯了一般;

(5)透明窗口單獨跑到桌面上去了,應用程序最小化不可見;

以上是使用層級窗口透明的方法以及使用該方法暴露的若干問題,針對以上問題,爲了完善或避免以上方法,我一直在尋找使得子窗口透明的方法,不巧,偶然中使用中空畫刷,這才讓我恍然大悟:中空HOLLOW_BRUSH就等於NULL_BRUSH,含義就是不使用畫刷,也就是不做畫刷填充,不填充其實就是透明,提到這邊不知道各位網友是否已經想到實現子窗口透明的方法?算了,不賣關子了,聽我細細道來:首先窗口以及窗口上的子控件繪製成什麼樣的背景是通過什麼方法告知窗口的,這裏提的字很關鍵, 是告知不是讓你代碼實現,對!就是通過OnCtlColor的返回值來告知父窗口到底將本窗口或本窗口子控件背景默認繪製成啥顏色,置於具體是返回本窗口還是本窗口子控件是通過OnCtlColor的參數UINT nCtlColor類型指定的,當爲CTLCOLOR_DLG時就是指定窗口的背景色,當是CTLCOLOR_EDIT時告知編輯框的背景色,CTLCOLOR_BUTTON告知按鈕默認的背景色...

通過以上指點分析,我們只要截獲ON_WM_CTLCOLOR消息,然後在該處理函數不論是什麼類型都返回空畫刷也就是return (HBRUSH)GetStockObject(HOLLOW_BRUSH);即可,這時候該窗口就透明瞭【該窗口指定爲其他窗口的子窗口後,則子窗口也透明】,如果還想再該透明子窗口上劃線、畫矩形等實現OnLbuttonDown、OnLbuttonup和OnMouseMove消息函數,在OnEraseBkGround處理函數中繪製即可!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章