SetLayeredWindowAttributes
编辑
此函数用于设置分层窗口透明度,常和 UpdateLayeredWindow 函数结合使用。
外文名
SetLayeredWindowAttributes
用 于
设置分层窗口透明度
结 合
UpdateLayeredWindow 函数
类 型
VB申明,C++申明
目录
声明
编辑
VB申明:
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
C++申明:
BOOL SetLayeredWindowAttributes(
HWND hwnd, // 指定分层窗口句柄
COLORREF crKey, // 指定需要透明的背景颜色值,可用RGB()宏
BYTE bAlpha, // 设置透明度,0表示完全透明,255表示不透明
DWORD dwFlags // 透明方式
);
其中,dwFlags参数可取以下值:
LWA_ALPHA时:crKey参数无效,bAlpha参数有效;
LWA_COLORKEY:窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。其常量值为1。
LWA_ALPHA | LWA_COLORKEY:crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
创建透明窗口
编辑
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性,方法可以在CreateWindowEx时指定,也可以SetWindowLong动态设置。如下代码可设置分层窗口:
LONG t = GetWindowLong(m_hWnd, GWL_EXSTYLE);
t |= WS_EX_LAYERED;
SetWindowLong(m_hWnd, GWL_EXSTYLE, t);
VC6.0调用
编辑
此函数在VC6.0中没有声明,需要自定义后在user32.dll后动态获取地址后调用。在VC9.0(VS2008)及其之后版本中可以直接调用
动态调用user32.dll中的SetLayeredWindowAttributes函数:
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;
}
C++ 宏值定义
编辑
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ 0x80000);
HINSTANCE hInst = LoadLibraryA("User32.DLL");
if (hInst != NULL)
{
typedef BOOL(WINAPI *MYFUNC)(HWND, COLORREF, BYTE, DWORD);
MYFUNC pFunc = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if (pFunc != NULL)
{
pFunc(m_hWnd, RGB(255,255,255), 0, 1);
}
FreeLibrary(hInst);
hInst = NULL;
}