首先,要熟悉WS_EX_LAYERED的概念,它是设置透明背景的重要参数。
看代码:
case WM_CREATE:
{
LONG Style = GetWindowLong(hWnd, GWL_EXSTYLE); //hWnd是主窗口句柄
SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0, 0, LWA_ALPHA);
}
GetWindowLong的作用是获取主窗口的样式,SetWindowLong是重新设置主窗口的样式,并在基础上添加了WS_EX_LAYERED样式,SetLayeredWindowAttributes函数是设置分层窗口的不透明度和透明度颜色键。
看函数原型:
BOOL SetLayeredWindowAttributes(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
我们只需关注第三个和第四个参数就行,因为我们需要设置透明窗口,则最后一个参数为LWA_ALPHA,第三个参数则是设置透明度,范围是0-255,具体效果可以自己试验看。
下面说如何设置静态控件的背景颜色
先说如何创建一个静态控件,参考下面代码:
HWND static_hwnd = CreateWindow(L"STATIC",
L"Title",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPSIBLINGS,
500, 500, 200, 50,
hWnd,
NULL,
NULL,
NULL);
那么静态控件创建好了,开始设置控件背景颜色
case WM_CTLCOLORSTATIC:
{
HDC hdcStatic = (HDC)wParam;
SetTextColor(hdcStatic, RGB(255, 255, 255)); //设置文字颜色
SetBkColor(hdcStatic, RGB(255, 0, 0));//设置文字背景颜色
SetBkMode(hdcStatic, TRANSPARENT);//设置控件背景为透明
return (INT_PTR)CreateSolidBrush(RGB(96, 96, 96));//设置控件背景颜色为灰色
}
既然说到背景颜色,再说一下主窗口的背景颜色设置
第一种,在注册类里面直接更改
HBRUSH hBrush = ::CreateSolidBrush(RGB(0, 0, 255));
wcex.hbrBackground = hBrush;
第二种,在WM_ERASEBKGND事件里面更改
case WM_ERASEBKGND:
{
HBRUSH brush;
RECT rect;
brush = CreateSolidBrush(RGB(255, 0, 255));
SelectObject((HDC)wParam, brush);
GetClientRect(hWnd, &rect);
Rectangle((HDC)wParam, rect.left, rect.top, rect.right, rect.bottom);
}