在win32中,要想给一个windows窗体设置背景颜色,有多种方式,我们来介绍两种比较常用的方式。

方式一:注册窗体的时候,设置背景画刷。

//定义窗口类
WNDCLASS wndClass; WNDCLASSEX a;
//窗口类样式
wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
//窗口过程函数
wndClass.lpfnWndProc = MyWndDef;
//窗口类无扩展
wndClass.cbClsExtra = 1;
//窗口实例无扩展
wndClass.cbWndExtra = 2;
//窗口所属实例句柄
wndClass.hInstance = hInstance;
//窗口最小化图标句柄
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
//窗口光标样式句柄
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
//窗口背景句柄 
wndClass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
//窗口类Menu名称
wndClass.lpszMenuName = NULL;
//窗口类的唯一名称
wndClass.lpszClassName = L"hello";

if (!RegisterClass(&wndClass)) {
	MessageBox(NULL, L"窗口类注册失败!", L"提示", MB_OK);
	return FALSE;
}

在以上代码中,我们通过wndClass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));设置了窗体的背景颜色句柄。当窗体显示出来之后,就会使用这个背景颜色。

方式二:在WM_PAINT中实时绘制背景颜色

//画一个背景
void DrawBkColor(HWND hwnd) {
	PAINTSTRUCT ps;
	HDC hdc = BeginPaint(hwnd, &ps);
	RECT rect = ps.rcPaint;
	DWORD color = 0xFF386382;
	SetBkColor(hdc, RGB(GetBValue(color), GetGValue(color), GetRValue(color)));//设置背景色
	ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);//绘制文本 使用SetBkColor指定的背景色绘制文本
	EndPaint(hwnd, &ps);
}

case WM_PAINT:
{

	DrawBkColor(hwnd);
	return 0;
}

在以上方法中,我们定义了一个方法DrawBkColor,用于实时绘制一个背景色。通过SetBkColor设置当前设备上下文(DC)的背景颜色。然后通过ExtTextOut方法直接对整个窗体的区域进行回值。ExtTextOut方法中的第四个参数为ETO_OPAQUE,这个参数表示我们应该使用背景色填充矩形区域。

ExtTextOut的MSDN官方文档为:https://learn.microsoft.com/zh-cn/windows/win32/api/wingdi/nf-wingdi-exttextoutw