今天说一下窗口的半透明设置,很多软件应用都有这个功能,比如QQ,迅雷等等,这种效果怎么做的呢,其实很简单
主要API,SetLayeredWindowAttributes
看一下函数原型
BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);
其中hWnd是需要透明的窗口句柄
crKey为掩码的颜色,可以用RGB(r,g,b)来指定。
bAlpha是不透明度,取值范围是(0,255,其中0代表全透明,255代表不透明。
dwFlags是透明方式,可以取两个值:LWA_ALPHA = 0×2,LWA_COLORKEY=0×1
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。
也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
要使窗口拥有透明效果,需要有WS_EX_LAYERED扩展属性的支持
实现过程:
在窗口初始化的地方,比如OnInitDialog函数,调用如下代码
1
2
|
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
SetLayeredWindowAttributes(0,150,LWA_ALPHA);
|
网上有很多朋友喜欢动态从User32.DLL中加载SetLayeredWindowAttributes
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE
hInstance = LoadLibrary(
"User32.DLL"
);
if
(hInstance)
{
typedef
BOOL
(WINAPI *MYFUNC)(
HWND
,
COLORREF
,
BYTE
,
DWORD
);
MYFUNC fun = NULL;
fun=(MYFUNC)GetProcAddress(hInstance,
"SetLayeredWindowAttributes"
);
if
(fun) fun(GetSafeHwnd(),0,150,LWA_ALPHA);
FreeLibrary(hInstance);
}
|