透明窗体的实现 - 博客大巴
来源:百度文库 编辑:神马文学网 时间:2024/04/25 23:48:17
透明窗体的实现 - [日记]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://zuowenp.blogbus.com/logs/80799819.html
要在windows下实现透明窗体,有两个函数可以使用,一个是SetLayeredWindowAttributes ,另一个是UpdateLayeredWindow 。
首先,使用这两个函数,窗口必须是WS_EX_LAYERED 属性,可以用SetWindowLong来声明。
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)来表示,bAlpha是透明度,取值在0-255之间,0为完全透明,255为完全不透明。dwFlags是标志位,用它的值表示透明的方式
LWA_COLORKEY 0x00000001 //表示用掩码颜色来透明
LWA_ALPHA 0x00000002 //表示用透明度来透明
比如要让一个窗口的黑色部分透明,就可以用
SetLayeredWindowAttributes(m_hWnd,RGB(0,0,0),0,LWA_COLORKEY);
由于标志位是LWA_COLORKEY,因此bAlph a是不起作用的。如果是LWA_ALPHA的话,那么整个窗口都会根据bAlpha的大小来显示透明度。
颜色透明的地方鼠标可以穿透,可以在很方便的做出异形窗体。
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)来取得。
pptDst用来指定新的分层窗口的起始位置,如果要保存位置不变,则可以为NULL。
psize用来指定分层窗口新的大小。如果不改变窗口大小,则可以为NULL。
hdcSrcd为如果来源DC句柄,如果不进行绘制,则可以为NULL。
pptSrc用来指定来源的屏幕位置。
crKey是掩码,可以用RGB(r,g,b)来生成。
pblend指向一个BLENDFUNCTION结构,如下定义
typedef struct _BLENDFUNCTION
{
BYTE BlendOp; // 指定源混合操作。目前,唯一的源和目标混合,已定义的AC_SRC_OVER。
BYTE BlendFlags; //必须是0。
BYTE SourceConstantAlpha; //透明度,取值0-255之间。
BYTE AlphaFormat; //可以定义为AC_SRC_ALPHA,表示位图有Alpha通道
}BLENDFUNCTION,*PBLENDFUNCTION;
dwFlags为标志位,可以取以下值
ULW_ALPHA 使用pblend为混合功能。
ULW_COLORKEY 使用crKey值为颜色的透明度。
ULW_OPAQUE 绘制一个不透明分层窗口。
要注意的是,一旦使用了UpdateLayeredWindow函数,那么它将接管窗口的绘制,不会响应WM_PAINT等消息,而窗口上面的控件也不会显示。如果你设定了pptDst和psize的话,就等于调用了setwindowpos函数改变了窗口的大小,这点要注意。