修改static控件背景颜色和文字颜色
来源:互联网 发布:2018中国人工智能大会 编辑:程序博客网 时间:2024/05/29 18:05
当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows 会使用该画刷来绘制控件背景(子窗口背景)。
也就是说,改变 static 控件的背景颜色只有这一种方式,就是处理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用来设置背景画刷的。
改变 static 控件的背景颜色:运行结果:
修改文字背景颜色使用 SetBkColor 函数,它的原型为:
修改文字前景色(文字颜色)使用 SetTextColor 函数,它的原型为:
这里我们修改的是 static 控件中的文本颜色,所以需要获取 static 控件的设备环境句柄。非常巧妙的是,发送 WM_CTLCOLORSTATIC 消息时,wParam 参数表示的就是 static 控件的设备环境句柄(lParam 表示控件句柄)。
下面的代码会修改文本的背景色和前景色:运行结果:
所以要想达到修改背景颜色的目的,除了修改static 控件的背景颜色,还要修改文本的背景颜色。
1) SetBkMode 函数可以用来设置文本的背景模式,它的原型为:iBkMode 有下面两种取值:
取值 说明 OPAQUE使用当前背景颜色来填充背景。TRANSPARENT背景透明。
2) GetStockObject (NULL_BRUSH); 语句可以返回没有颜色的画刷。
示例代码:运行效果:
也就是说,改变 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 //背景模式
- );
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); //无颜色画刷
0 0
- 修改static控件背景颜色和文字颜色
- 可以设置背景和文字颜色的Static控件
- 修改控制台的文字和背景颜色
- 设置static控件背景颜色、控件字体的背景颜色和控件字体的颜色
- 修改CButton类按钮背景颜色和文字颜色
- MFC 修改 STATIC控件颜色,字体颜色
- QT 修改控件背景颜色
- static text文字修改颜色和字体的解决办法
- 关于static text文字修改颜色和字体的解决办法
- Android-设置控件背景及文字颜色
- 如何改变STATIC控件的文字颜色
- 如何改变STATIC控件的文字颜色
- 如何改变STATIC控件的文字颜色
- vc具有背景颜色和文字颜色的只读属性的EDIT控件的实现
- 修改FloatingActionButton的title的文字颜色及背景颜色
- MFC中修改控件的文字和颜色
- 关于修改CEdit控件背景颜色总结
- VC++改变窗口背景颜色和使得Static控件背景透明
- Windows static控件(静态文本框控件)
- Windows CreateFont:创建自己的字体
- Windows button控件(按钮控件)
- MSG结构体和WndProc窗口过程详解
- Windows edit控件(编辑框控件)
- 修改static控件背景颜色和文字颜色
- Windows单选按钮、复选框、分组框控件
- 判断单选按钮和复选框是否被选中
- .NET垃圾回收器原理
- 适配器
- externalsorting
- AsyncTask的缺陷和问题
- 智能提示suggestion,附近地点搜索
- mac install pip