版權(quán)聲明:轉(zhuǎn)載時(shí)請(qǐng)以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
http://zuowenp.blogbus.com/logs/80799819.html
要在windows下實(shí)現(xiàn)透明窗體,有兩個(gè)函數(shù)可以使用,一個(gè)是SetLayeredWindowAttributes ,另一個(gè)是UpdateLayeredWindow 。
首先,使用這兩個(gè)函數(shù),窗口必須是WS_EX_LAYERED 屬性,可以用SetWindowLong來(lái)聲明。
SetLayeredWindowAttributes (分層窗口),MSDN的介紹如下。
The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.
Syntax
BOOL SetLayeredWindowAttributes(
HWND hwnd ,
COLORREF crKey ,
BYTE bAlpha ,
DWORD dwFlags );
其中hwnd是窗口的句柄,crKey是掩碼,即要透明的顏色,用RGB(r,g,b)來(lái)表示,bAlpha是透明度,取值在0-255之間,0為完全透明,255為完全不透明。dwFlags是標(biāo)志位,用它的值表示透明的方式
LWA_COLORKEY 0x00000001 //表示用掩碼顏色來(lái)透明
LWA_ALPHA 0x00000002 //表示用透明度來(lái)透明
比如要讓一個(gè)窗口的黑色部分透明,就可以用
SetLayeredWindowAttributes(m_hWnd,RGB(0,0,0),0,LWA_COLORKEY);
由于標(biāo)志位是LWA_COLORKEY,因此bAlph a是不起作用的。如果是LWA_ALPHA的話(huà),那么整個(gè)窗口都會(huì)根據(jù)bAlpha的大小來(lái)顯示透明度。
顏色透明的地方鼠標(biāo)可以穿透,可以在很方便的做出異形窗體。
The UpdateLayeredWindow function updates the position, size, shape, content, and translucency of a layered window.
Syntax
BOOL UpdateLayeredWindow(
HWND hwnd,
HDC hdcDst,
POINT *pptDst,
SIZE *psize,
HDC hdcSrc,
POINT *pptSrc,
COLORREF crKey,
BLENDFUNCTION *pblend,
DWORD dwFlags
);
hwnd為窗口句柄。
hdcDst為目的DC句柄,可以用GetWindowDC(hwnd)來(lái)取得。
pptDst用來(lái)指定新的分層窗口的起始位置,如果要保存位置不變,則可以為NULL。
psize用來(lái)指定分層窗口新的大小。如果不改變窗口大小,則可以為NULL。
hdcSrcd為如果來(lái)源DC句柄,如果不進(jìn)行繪制,則可以為NULL。
pptSrc用來(lái)指定來(lái)源的屏幕位置。
crKey是掩碼,可以用RGB(r,g,b)來(lái)生成。
pblend指向一個(gè)BLENDFUNCTION結(jié)構(gòu),如下定義
typedef struct _BLENDFUNCTION
{
BYTE BlendOp; // 指定源混合操作。目前,唯一的源和目標(biāo)混合,已定義的AC_SRC_OVER。
BYTE BlendFlags; //必須是0。
BYTE SourceConstantAlpha; //透明度,取值0-255之間。
BYTE AlphaFormat; //可以定義為AC_SRC_ALPHA,表示位圖有Alpha通道
}BLENDFUNCTION,*PBLENDFUNCTION;
dwFlags為標(biāo)志位,可以取以下值
ULW_ALPHA 使用pblend為混合功能。
ULW_COLORKEY 使用crKey值為顏色的透明度?! ?/p>
ULW_OPAQUE 繪制一個(gè)不透明分層窗口。
要注意的是,一旦使用了UpdateLayeredWindow函數(shù),那么它將接管窗口的繪制,不會(huì)響應(yīng)WM_PAINT等消息,而窗口上面的控件也不會(huì)顯示。如果你設(shè)定了pptDst和psize的話(huà),就等于調(diào)用了setwindowpos函數(shù)改變了窗口的大小,這點(diǎn)要注意。
聯(lián)系客服