当 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; }
运转后果:
修正文字配景色彩
上图中,我们的代码只是改动了控件的配景色彩(全部子窗口的配景色彩),却疏忽了文字的配景色彩。
修正文字配景色彩运用 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 控件的配景色彩,还要修正文本的配景色彩。
通明配景
完成通明配景需求设置文本配景色彩通明,同时前往没有色彩的画刷。
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); //无色彩画刷
运转后果: