当 static 控件或具有 ES_READONLY 作风的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 音讯。假如我们在窗口进程中处置该音讯,就必需前往一个画刷句柄,Windows 会运用该画刷来绘制控件配景(子窗口配景)。
也就是说,改动 static 控件的配景色彩只要这一种方法,就是处置 WM_CTLCOLORSTATIC 音讯。WM_CTLCOLORSTATIC 音讯就是用来设置配景画刷的。
改动 static 控件的配景色彩:

			LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdcWnd; 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, 400 /*400表现正常字体*/, FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("微软雅黑") ); //创立静态文本框控件 hStatic = CreateWindow(TEXT("static"), TEXT("欢迎离开C言语中文网!"), 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: 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; }

运转后果:
修正static控件配景色彩和文字色彩_文本框

修正文字配景色彩

上图中,我们的代码只是改动了控件的配景色彩(全部子窗口的配景色彩),却疏忽了文字的配景色彩。
修正文字配景色彩运用 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("欢迎离开C言语中文网!"), 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; }

运转后果:
修正static控件配景色彩和文字色彩_message_02
所以要想到达修正配景色彩的目标,除了修正static 控件的配景色彩,还要修正文本的配景色彩。

通明配景

完成通明配景需求设置文本配景色彩通明,同时前往没有色彩的画刷。
1) SetBkMode 函数可以用来设置文本的配景形式,它的原型为:

			int SetBkMode( HDC hdc, //装备情况句柄 int iBkMode //配景形式 );

iBkMode 有下面两种取值:

取值阐明
OPAQUE运用以后配景色彩来填充配景。
TRANSPARENT配景通明。


2) GetStockObject (NULL_BRUSH); 语句可以前往没有色彩的画刷。
示例代码:

			case WM_CTLCOLORSTATIC: hdcStatic = (HDC)wParam; SetTextColor( hdcStatic, RGB(0x41, 0x96, 0x4F) ); //翠绿色 SetBkMode(hdcStatic, TRANSPARENT); //通明配景 return (INT_PTR)GetStockObject(NULL_BRUSH); //无色彩画刷

运转后果:
修正static控件配景色彩和文字色彩_文本框_03