在文章《WM_CTLCOLORBTN消息就是一个摆设》中,我们知道,WM_CTLCOLORBTN消息实际上就成了摆设,这是设计失误。然而,这个并不影响其他控件的颜色修改。在学习了控件颜色修改消息WM_CTLCOLORBTN之后,我隐隐的担心其他控件消息是不是也没有用,然而我多虑了。可能下压按钮控件的特殊性吧。
不过,与下压按钮控件修改颜色的原理是一样的,在WM_CTLCOLORSTATIC消息中,修改文字颜色、文字背景颜色以及返回一个画刷即可。
我们先创建一个static静态控件,即在CreateWindow函数中使用"static"窗口类来创建窗口,其他参数和普通窗口差不多。不过记得加上窗口风格WS_CHILD和WS_VISIBLE,这样创建完毕后,在窗口上就可以看到static静态控件了。
我们还要创建一个画刷,用于修改static静态控件表面的颜色的,也就是static静态控件这个子窗口的窗口背景颜色。控件就是一个窗口。不过要记得,要删除我们自己创建的画刷。我们这里就在窗口创建时(WM_CREATE消息)创建画刷和Static静态控件,在窗口销毁时(WM_DESTROY消息)删除我们自己创建的画刷。
而我们要修改static静态控件的文字颜色、文字背景颜色和static静态控件颜色,就看WM_CTLCOLORSTATIC消息了。
WM_CTLCOLORSTATIC消息的WPARAM参数是Static静态控件传过来的已经创建好的设备上下文的句柄,即HDC类型的值。我们做一个强制转换,然后就可以拿来用了。然后调用SetTextColor函数来修改文字的颜色,调用SetBkColor函数来修改文字背景颜色。然后将我们事先创建好的画刷句柄在这个消息中返回即可。
这个流程你看了,照做了,确实能够实现效果。然而,知其然不知其所以然呀!看完前面,你做出来了。你会做了。你能表明你熟了。然而不是高手,更不是大神。后面才是精彩的分析部分。
考虑到篇幅和接受情况,新手第一次接触,可能不太熟悉。所以本文就告诉你怎么实现这个效果,并给出完整代码,让你清楚实现代码和过程。有了这个基础,再看原理分析,就容易理解了。
我们的效果图如下:
【Static标签颜色文字颜色文字背景颜色的设置效果图】
下面是完整的代码:#include "windows.h"
#include <tchar.h>
TCHAR tip[]=_T("C++技术网http://www.cjjjs.com");
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HBRUSH hBrush;
switch (message)
{
case WM_CREATE:
{
//创建静态控件
CreateWindow(_T("static"),_T("C++技术网http://www.cjjjs.com"),WS_CHILD|WS_VISIBLE,0,0,300,100,hwnd,(HMENU)1,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),0);
hBrush = CreateSolidBrush(RGB(200,10,210));//创建一个画刷
return 0;
}
case WM_CTLCOLORSTATIC:
{
HDC hdc = (HDC)wParam;//将传过来的参数转成正确的类型,供后面使用
SetTextColor(hdc,RGB(255,255,100));//设置文字颜色
SetBkColor(hdc,RGB(100,50,150));//设置文字背景颜色
return (LRESULT)hBrush;//返回画刷,用于修改static控件颜色
}
case WM_DESTROY:
DeleteObject(hBrush);//记得删除创建的画刷,养成好习惯
PostQuitMessage(0);
return 0;
default:
break;//跳出到默认处理
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
if(!RegisterClass(&wndClass))return 0;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,10,100,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}