设置窗口的透明度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
函数的原型为
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
);
其中
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). (VC6.0 中 主函数开头加#define WS_EX_LAYERED 0x00080000即可)
WS_EX_LAYERED = &H80000
比如用C语言编windows SDK程序,实现透明窗口,在VC6.0中,开头加一句#define WS_EX_LAYERED 0x00080000 
VC6 中 只要加入这段代码在顶部 就可以使用SetLayeredWindowAttributes了  #define WS_EX_LAYERED 0x00080000
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
typedef BOOL (FAR WINAPI *LAYERFUNC)(HWND,COLORREF,BYTE,DWORD);
BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags)
{
LAYERFUNC SetLayer;
HMODULE hmod = LoadLibrary("user32.dll");
SetLayer=(LAYERFUNC)GetProcAddress(hmod,"SetLayeredWindowAttributes");
BOOL bReturn = SetLayer(hwnd,crKey,bAlpha,dwFlags);
FreeLibrary(hmod);
return bReturn;
}
 
例如:
 
COLORREF crKey = RGB(0, 0, 0);
		//颜色值为crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度
		fSetLayeredWindowAttributes(m_hWndPaint, crKey, nOpacity, LWA_COLORKEY | LWA_ALPHA);

你可能感兴趣的:(设置窗口的透明度SetLayeredWindowAttributes)