Windows API学习-修改控件背景文字颜色(2)


修改文字背景颜色

上节中,我们的代码只是改变了控件的背景颜色(整个子窗口的背景颜色),却忽略了文字的背景颜色。

修改文字背景颜色使用 SetBkColor 函数,它的原型为:

COLORREF SetBkColor(
    HDC      hdc,  //设备环境句柄
    COLORREF crColor  //背景颜色
);

修改文字前景色(文字颜色)使用 SetTextColor 函数,它的原型为:

COLORREF SetTextColor(
    HDC      hdc,  //设备环境句柄
    COLORREF crColor  //背景颜色
);

这里我们修改的是 static 控件中的文本颜色,所以需要获取 static 控件的设备环境句柄。非常巧妙的是,发送 WM_CTLCOLORSTATIC 消息时,wParam 参数表示的就是 static 控件的设备环境句柄(lParam 表示控件句柄)。

下面的代码会修改文本的背景色和前景色:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	PAINTSTRUCT ps;
	HDC hdcWnd;
	HDC hdcStatic;
	static HFONT hFont;  //逻辑字体
	static HWND hStatic;  //静态文本框控件
	static HBRUSH hBrush;  //画刷
	switch (message) {
	case  WM_CREATE:
		//创建画刷
		hBrush = CreateSolidBrush(RGB(0x41, 0x96, 0x4F));
		//创建逻辑字体
		hFont = CreateFont(-14/*高*/, -7/*宽*/, 0, 0, 700 /*700表示粗体*/,
			FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/, DEFAULT_CHARSET,
			OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
			FF_DONTCARE, TEXT("微软雅黑")
		);
		//创建静态文本框控件
		hStatic = CreateWindow(TEXT("static"), TEXT("欢迎来到泛容!"),
			WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER,
			20 /*x坐标*/, 20 /*y坐标*/, 240 /*宽度*/, 60 /*高度*/,
			hWnd /*父窗口句柄*/, (HMENU)1 /*控件ID*/, hInst /*当前程序实例句柄*/, NULL
		);
		//设置控件的字体
		SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL);
		break;
	case WM_CTLCOLORSTATIC:
		hdcStatic = (HDC)wParam;
		SetTextColor(hdcStatic, RGB(255, 255, 255));  //白色
		SetBkColor(hdcStatic, RGB(0x41, 0x96, 0x4F));  //翠绿色
		return (INT_PTR)hBrush;
	case WM_PAINT:
		hdcWnd = BeginPaint(hWnd, &ps);
		// TODO:  在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		DeleteObject(hBrush);
		DeleteObject(hFont);
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

运行结果:
2.png