修改static控件背景颜色和文字颜色
当 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(-/*高*/, -/*宽*/, , , /*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,
- /*x坐标*/, /*y坐标*/, /*宽度*/, /*高度*/,
- hWnd /*父窗口句柄*/, (HMENU) /*控件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();
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return ;
- }
运行结果:
修改文字背景颜色
上图中,我们的代码只是改变了控件的背景颜色(整个子窗口的背景颜色),却忽略了文字的背景颜色。
修改文字背景颜色使用 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(-/*高*/, -/*宽*/, , , /*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,
- /*x坐标*/, /*y坐标*/, /*宽度*/, /*高度*/,
- hWnd /*父窗口句柄*/, (HMENU) /*控件ID*/, hInst /*当前程序实例句柄*/, NULL
- );
- //设置控件的字体
- SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL);
- break;
- case WM_CTLCOLORSTATIC:
- hdcStatic = (HDC)wParam;
- SetTextColor( hdcStatic, RGB(, , ) ); //白色
- 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();
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return ;
- }
运行结果:
所以要想达到修改背景颜色的目的,除了修改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控件背景颜色和文字颜色的更多相关文章
- MFC解决Static控件背景透明时文本覆盖重影
通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与 ...
- c#winform中如何修改ListView控件每个单元格的颜色
ListView在View属性为Details的时候它呈现的方式和DataGirdView差不多,它的每一行都是一个ListViewItem,然而每个ListViewItem都有一个BackColor ...
- static 控件颜色修改
在对话框上放一个StaticText控件后如果文字长度不能铺满控件的 rect,如下: 那么运行时会出现如下效果 通过MSG_WM_CTLCOLORSTATIC消息修改static控件背景色模式为透明 ...
- VC OnCtlColor函数来修改控件背景颜色
CWnd::OnCtlColor afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值:OnCtlColor必须 ...
- win32 修改Edit控件文本颜色与背景色
#define WM_CTLCOLORMSGBOX 0x0132 #define WM_CTLCOLOREDIT 0x0133 //编辑控件Edit #define WM_CTLCOLORLISTBO ...
- iOS开发——UI高级OC篇&自定义控件之调整按钮中子控件(图片和文字)的位置
自定义控件之调整按钮中子控件(图片和文字)的位置 其实还有一种是在storyBoard中实现的,只需要设置对应空间的左右间距: 这里实现前面两种自定义的方式 一:imageRectForContent ...
- C#控件背景透明的几种解决方案
已经很少做winform程序了,最新参与了一个小项目,遇到了控件背景透明的功能要求,特在此总结一下,供有需要的同行参考. 0.背景透明的概念和分类 背景透明是啥意思呢,就是背景透明.哈哈,废话了.其实 ...
- 绘制n边形:用两个以上的控件来控制矩形的颜色、大小、位置及空实心(程序代写)
绘制n边形:用两个以上的控件来控制矩形的颜色.大小.位置及空实心.(n由键盘输入) package lzy.di9zhang; import java.awt.BorderLayout;import ...
- Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
随机推荐
- BAT&注册表重定向劫持
RunJS 常用引导,有时启动某个应用需要环境变量可以这样启动应用,会对启动的进程生效,即被继承 set PATH=D:\Developer\sdk\platform-tools;%PATH% D: ...
- notpad++快捷键
Notpad++快捷键 Notepad++选中行操作 快捷键 使用技巧 作者: Rememberautumn 分类: 其他 发布时间: 2014-09-04 14:18 阅读: 60,106 微信小 ...
- MVC 基于FormsAuthentication 方式的权限验证
1.登录的代码 1 [HttpPost] 2 public ActionResult Index(User entity) 3 { 4 User user = GetUser(entity.Name, ...
- (白书训练计划)UVa 11572 Unique Snowflakes(窗体滑动法)
题目地址:UVa 11572 这样的方法曾经接触过,定义两个指针,不断从左向右滑动,推断指针内的是否符合要求. 这个题为了能高速推断是否有这个数,能够用STL中的set. 代码例如以下: #inclu ...
- MapReduce算法形式三:cleanup
案例三:cleanup 其实这个案例可以不用写这么复杂,不用cleanup也能写,但是为了,突显,突显,突显(重要的事说四遍)cleanup的重要性,琢磨了半天,恩,这样写既可以突显cleanup又显 ...
- [译]Flutter JSON和序列化
[译]Flutter JSON和序列化 很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据.制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON. 本指南介绍了如何 ...
- ajax访问json文件缓存问题
ajax访问json文件,json文件改动,访问的时候也不能及时看到改动后的内容. 这是因为浏览器缓存的原因. 在这时候就需要清除浏览器的缓存或者加上一个标记,让ajax访问文件的时候知道这是一个新的 ...
- FileReader、 FileWriter、readLine()和newLine()、LineNumberReader(二十一)
1.字符流FileReader * 1.字符流是什么 * 字符流是可以直接读写字符的IO流 * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出. ...
- html5--6-4 CSS选择器
html5--6-4 CSS选择器 实例 学习要点 掌握常用的CSS选择器 了解不太常用的CSS选择器 什么是选择器 当我们定义一条样式时候,这条样式会作用于网页当中的某些元素,所谓选择器就是样式作用 ...
- HDU - 1269 迷宫城堡(有向图的强连通分量)
d.看一个图是不是强连通图 s.求出强连通分量,看看有没有一个强连通分量包含所有点. c.Tarjan /* Tarjan算法 复杂度O(N+M) */ #include<iostream> ...