2012-12-20 16:49:17
李国帅
例子
#define LWA_COLORKEY 1
#define LWA_ALPHA 2
#define WS_EX_LAYERED 0x00080000
typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
lpfn g_pSetLayeredWindowAttributes = NULL;
void CsimpledlgDlg::OnBnClickedButton1()
{
if (g_pSetLayeredWindowAttributes == NULL)
{
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
}
if (g_pSetLayeredWindowAttributes != NULL)
{
HWND hWnd = GetSafeHwnd();
LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);
g_pSetLayeredWindowAttributes(hWnd, 0x00ffffff, (BYTE)192, 2);
::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
}
}
WinAPI透明窗体函数
SetLayeredWindowAttributes SetLayeredWindowAttributes
BOOL SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );
hwnd是透明窗体的句柄,
crKey为颜色值,
bAlpha是透明度,取值范围是[0,255],
dwFlags是透明方式,可以取两个值:
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明。
LWA_ALPHA = 0x2
LWA_COLORKEY=0x1
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性
(旧的sdk没有定义这个属性,所以可以直接指定为0x80000).
WS_EX_LAYERED = 0x80000
void CsimpledlgDlg::OnBnClickedButton1()
{
HWND hWnd = GetSafeHwnd();
LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);
::SetLayeredWindowAttributes(hWnd, 0x00000000, (BYTE)128, LWA_COLORKEY);
//::SetLayeredWindowAttributes(hWnd, 0x00000000, (BYTE)128, LWA_ALPHA);
::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
}