1. 程式人生 > >Window 透明窗體的實現總結

Window 透明窗體的實現總結



此片文章是以前寫的, 剛剛新開了部落格, 就發出來跟大家分享下。

這篇文章主要講得是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。