半透明窗口中顯示標準控件(控件與文字不透明)的實現方案(附源碼)

原文 http://blog.csdn.net/harbinzju/article/details/7907127


和大家分享一下在半透明窗口中顯示標準控件的實現方案。通過層疊窗口可以簡單實現半透明與不規則形狀窗口的效果,但在其上顯示標準控件(控件與文字不透明)卻是件比較有挑戰的事情,這裏會給出一個可行的解決方案。同時實現了一些可重用的窗口類,有相關需求時可以進行引用。先看一下效果圖:



一、半透明窗口實現原理

繪製半透明窗口的通常做法是爲窗口設置WS_EX_LAYERED屬性,通過UpdateLayeredWindow或者SetLayeredWindowAttributes來設置窗口透明度等屬性。這兩種方法有一些區別、適合的場景也不同。

UpdateLayeredWindow:調用後窗口的繪製被接管,應用負責主動調用這個函數進行繪製,窗口及其控件不再能接收到WM_PAINT消息。可以把帶有透明像素的PNG圖片直接繪製在窗口上,實現不同程序的透明效果。

SetLayeredWindowAttributes:有兩種模式:1. 指定特定像素透明。2. 設置整個窗口統一的透明度(包括控件)。使用這個函數再設置窗口透明,窗口及控件仍可以收到WM_PAINT消息。


需要特別注意的是UpdateLayeredWindowSetLayeredWindowAttributes的互斥性,在調用SetLayeredWindowAttributes後再調用UpdateLayeredWindow都會失敗。

 

二、實現不規則窗口繪製

不規則的形狀由PNG圖片通過設置透明區域來實現,程序需要實現全透明區域的鼠標消息也透明。將需要進行透明處理的區域色彩設置爲RGB(r,g,b),可以直接設置爲RGB(0,0,0),通過SetLayeredWindowAttributes,將COLORREFcrKey參數設爲RGB(r,g,b),即可以實現,這個透明效果不只是視覺上的透明,同時也會透過鼠標消息

 

三、在半透明背景中實現控件不透明

有時候我們只希望有透明像素的圖片來做背景或者希望整個窗口有一定的透明度,但其上的控件不想做透明處理,否則控件上的文字會變得不明顯,影響使用。這裏提供的是雙層窗口的解決方案。前景窗口作爲背景窗口的子窗口,兩個窗口時刻保持同樣尺寸,同時移動,關閉事件關聯處理。


前端窗口窗體全透明,並且透過鼠標消息,控件放置在前端窗口,不透明。實現方法是對WM_CTLCOLOR消息進行處理,窗口畫刷返回m_crKey(比如RGB(0, 255, 0))顏色的畫刷,其它控件默認處理。在窗口初始化的時候使用::SetLayeredWindowAttributes(m_hWnd, m_crKey, 0, LWA_COLORKEY); 設置對這個顏色透明。

[cpp] view plain copy
  1. <span style="font-size:18px;">HBRUSH CStandardDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)    
  2. {    
  3.     if (nCtlColor == CTLCOLOR_DLG)    
  4.     {    
  5.         return CreateSolidBrush(m_crKey);    
  6.     }    
  7.      
  8.     return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);    
  9. }</span>  

背景窗口使用預設的PNG圖片,通過UpdateLayeredWindow繪製,並設置全透明的區域透過鼠標消息。調用UpdateLayeredWindow後窗口內容會被系統緩存,所以在窗口創建初次繪製後,如果沒有特殊需要是不需要去重畫背景窗口的。

 

這個方案支持所有標準的控件,同時也支持ActiveX控件,只要繼承通用的基類,使用起來十分方便,有興趣的朋友可以自己玩一下。附件的Demo主窗口展示了不規則形狀窗口,鏤空效果,控件懸浮效果,及ActiveX控件的使用;控件Demo中羅列了一系列標準控件。在Vista及以後的系統,由於有新API的支持可以實現更簡單的半透明窗口(毛玻璃效果),就不用這麼費周折了。

 

四、參考資料

http://www.codeproject.com/Articles/42032/Perfect-Semi-transparent-Shaped-Dialogs-with-Stand

http://www.codeproject.com/Articles/34158/Cool-Semi-transparent-and-Shaped-Dialogs-with-Stan

 

五、代碼下載

http://download.csdn.net/detail/harbinzju/4525285


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