Window 透明窗體的實現總結
阿新 • • 發佈:2019-01-05
此片文章是以前寫的, 剛剛新開了部落格, 就發出來跟大家分享下。
這篇文章主要講得是vc中各種分層、透明、不規則視窗的實現, 基本囊括GDI、GDI+能使用的所有方法。
本文講述了三種方法,其中第一種方法有兩種不同效果,第三種方法有兩種不同的實現方式。文中有方法使用了GDi+,關於GDI+的使用請自行查詢資料,本文不進行細述。
方法一:窗體整體透明,支援子控制元件透明,支援OnPaint重繪。
這個方法比較簡單,使用win32 Api 中SetLayeredWindowAttributes函式即可,關於該函式可查詢MSDN,用這種方法有兩種效果:
效果1:窗體整體透明,子控制元件也透明,可以實現半透明效果
//第一步要修改窗體屬性,WS_EX_LAYERED支援透明
LONG lWindowStyle = ::GetWindowLong(hwnd, GWL_EXSTYLE) |
WS_EX_LAYERED;
//設定Alpha不透明度
BYTE byteAlpha = 150;
//注意最後一個引數為LWA_ALPHA,第二個引數顏色掩碼(透明
//色無用)
SetLayeredWindowAttributes(m_hwnd, 0/*any*/, byteAlpha,LWA_ALPHA )
效果2:窗體整體透明,子控制元件不透明,實現不規則窗體,區域透明。
首先需要一張背景點陣圖,需要透明的地方用單一顏色填充,然後將其貼在背景上,程式碼如下:
第一步跟效果一中一樣需修改窗體屬性
::SetWindowLong(hwnd, GWL_EXSTYLE, lWindowStyle);
//將紅色設為透明色, 注意透明區域滑鼠並不能穿透RGB(255, 0, 0)
//為透明色
//注意最後一個引數為LWA_COLORKEY,第三個引數透明度無用
::SetLayeredWindowAttributes(hwnd, RGB(255, 0, 0), 111/*any*/,
LWA_COLORKEY);
需要注意的是效果1和效果2可以結合起來使用,最後一個引數改成LWA_COLORKEY | LWA_ALPHA即可。使用SetLayeredWindowAttributes函式實現不規則形狀簡單易行,但是通常會有鋸齒很難處理。
方法二:根據點陣圖進行區域裁剪 ,關鍵函式CombineRgn和SetWindowRgn。