用SetLayeredWindowAttributes函数设置透明窗体
用SetLayeredWindowAttributes函数设置透明窗体
使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。
SetLayeredWindowAttributes的函数原型如下:
BOOL SetLayeredWindowAttributes(
HWND hwnd, handle to the layered window
COLORREF crKey, specifies the color key
BYTE bAlpha, value for the blend function
DWORD dwFlags action
);
Requirements
Windows NT2000XP Included in Windows 2000 and later.
Windows 9598Me Unsupported.(注意了,在win9x里没法使用的)
Header Declared in Winuser.h; include Windows.h.
Library Use User32.lib.
一些常量
WS_EX_LAYERED = 0x80000;
LWA_ALPHA = 0x2;
LWA_COLORKEY=0x1
其中dwFlags有LWA_ALPHA和LWA_COLORKEY
LWA_ALPHA被设置的话,通过bAlpha决定透明度.
LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧的sdk没有定义这个属性,所以可以直接指定为0x80000).
例子代码
在OnInitDialog()加入
加入WS_EX_LAYERED扩展属性
SetWindowLong(this-GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this-GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary(User32.DLL);
if(hInst)
{
typedef BOOL (WINAPI MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, SetLayeredWindowAttributes);
if(fun)fun(this-GetSafeHwnd(),0,128,2);
FreeLibrary(hInst);
}
稍加修改还可以作出淡出淡入的效果. 注意第三个参数(128)不要取得太小了,为0的话就完全透明,看不到了。
SetLayeredWindowAttributes函数
SetLayeredWindowAttributes Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
hWnd是透明窗体的句柄,
crKey为掩码的颜色,可以用RGB(r,g,b)来指定。
bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。
dwFlags是透明方式,可以取两个值:
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。
LWA_ALPHA = 0x2
LWA_COLORKEY=0x1
也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性,方法:
先声明GetWindowLong和SetWindowLong
Dim rtn As Long
rtn = GetWindowLong(Me.hWnd, -20)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong Me.hWnd, -20, rtn
(旧的sdk没有定义WS_EX_LAYERED,所以可以直接指定为&H80000).
WS_EX_LAYERED = &H80000