当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows 会使用该画刷来绘制控件背景(子窗口背景)。

也就是说,改变 static 控件的背景颜色只有这一种方式,就是处理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用来设置背景画刷的。

改变 static 控件的背景颜色:

  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
  2. PAINTSTRUCT ps;
  3. HDC hdcWnd;
  4. static HFONT hFont; //逻辑字体
  5. static HWND hStatic; //静态文本框控件
  6. static HBRUSH hBrush; //画刷
  7. switch (message){
  8. case WM_CREATE:
  9. //创建画刷
  10. hBrush = CreateSolidBrush( RGB(0x41, 0x96, 0x4F) ); //翠绿色
  11. //创建逻辑字体
  12. hFont = CreateFont(-/*高*/, -/*宽*/, , , /*400表示正常字体*/,
  13. FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/,DEFAULT_CHARSET,
  14. OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
  15. FF_DONTCARE, TEXT("微软雅黑")
  16. );
  17. //创建静态文本框控件
  18. hStatic = CreateWindow(TEXT("static"), TEXT("欢迎来到C语言中文网!"),
  19. WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER,
  20. /*x坐标*/, /*y坐标*/, /*宽度*/, /*高度*/,
  21. hWnd /*父窗口句柄*/, (HMENU) /*控件ID*/, hInst /*当前程序实例句柄*/, NULL
  22. );
  23. //设置控件的字体
  24. SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL);
  25. break;
  26. case WM_CTLCOLORSTATIC:
  27. return (INT_PTR)hBrush; //这里必须返回画刷句柄
  28. case WM_PAINT:
  29. hdcWnd = BeginPaint(hWnd, &ps);
  30. // TODO: 在此添加任意绘图代码...
  31. EndPaint(hWnd, &ps);
  32. break;
  33. case WM_DESTROY:
  34. DeleteObject(hBrush);
  35. DeleteObject(hFont);
  36. PostQuitMessage();
  37. break;
  38. default:
  39. return DefWindowProc(hWnd, message, wParam, lParam);
  40. }
  41. return ;
  42. }

运行结果:

修改文字背景颜色
上图中,我们的代码只是改变了控件的背景颜色(整个子窗口的背景颜色),却忽略了文字的背景颜色。

修改文字背景颜色使用 SetBkColor 函数,它的原型为:

  1. COLORREF SetBkColor(
  2. HDC hdc, //设备环境句柄
  3. COLORREF crColor //背景颜色
  4. );

修改文字前景色(文字颜色)使用 SetTextColor 函数,它的原型为:

  1. COLORREF SetTextColor(
  2. HDC hdc, //设备环境句柄
  3. COLORREF crColor //背景颜色
  4. );

这里我们修改的是 static 控件中的文本颜色,所以需要获取 static 控件的设备环境句柄。非常巧妙的是,发送 WM_CTLCOLORSTATIC 消息时,wParam 参数表示的就是 static 控件的设备环境句柄(lParam 表示控件句柄)。

下面的代码会修改文本的背景色和前景色:

  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
  2. PAINTSTRUCT ps;
  3. HDC hdcWnd;
  4. HDC hdcStatic;
  5. static HFONT hFont; //逻辑字体
  6. static HWND hStatic; //静态文本框控件
  7. static HBRUSH hBrush; //画刷
  8. switch (message){
  9. case WM_CREATE:
  10. //创建画刷
  11. hBrush = CreateSolidBrush( RGB(0x41, 0x96, 0x4F) );
  12. //创建逻辑字体
  13. hFont = CreateFont(-/*高*/, -/*宽*/, , , /*700表示粗体*/,
  14. FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/,DEFAULT_CHARSET,
  15. OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
  16. FF_DONTCARE, TEXT("微软雅黑")
  17. );
  18. //创建静态文本框控件
  19. hStatic = CreateWindow(TEXT("static"), TEXT("欢迎来到C语言中文网!"),
  20. WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER,
  21. /*x坐标*/, /*y坐标*/, /*宽度*/, /*高度*/,
  22. hWnd /*父窗口句柄*/, (HMENU) /*控件ID*/, hInst /*当前程序实例句柄*/, NULL
  23. );
  24. //设置控件的字体
  25. SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL);
  26. break;
  27. case WM_CTLCOLORSTATIC:
  28. hdcStatic = (HDC)wParam;
  29. SetTextColor( hdcStatic, RGB(, , ) ); //白色
  30. SetBkColor( hdcStatic, RGB(0x41, 0x96, 0x4F) ); //翠绿色
  31. return (INT_PTR)hBrush;
  32. case WM_PAINT:
  33. hdcWnd = BeginPaint(hWnd, &ps);
  34. // TODO: 在此添加任意绘图代码...
  35. EndPaint(hWnd, &ps);
  36. break;
  37. case WM_DESTROY:
  38. DeleteObject(hBrush);
  39. DeleteObject(hFont);
  40. PostQuitMessage();
  41. break;
  42. default:
  43. return DefWindowProc(hWnd, message, wParam, lParam);
  44. }
  45. return ;
  46. }

运行结果:


所以要想达到修改背景颜色的目的,除了修改static 控件的背景颜色,还要修改文本的背景颜色。
透明背景
实现透明背景需要设置文本背景颜色透明,同时返回没有颜色的画刷。

1) SetBkMode 函数可以用来设置文本的背景模式,它的原型为:

  1. int SetBkMode(
  2. HDC hdc, //设备环境句柄
  3. int iBkMode //背景模式
  4. );

iBkMode 有下面两种取值:
取值         说明
OPAQUE       使用当前背景颜色来填充背景。
TRANSPARENT      背景透明。

2) GetStockObject (NULL_BRUSH); 语句可以返回没有颜色的画刷。

示例代码:
复制纯文本新窗口

  1. case WM_CTLCOLORSTATIC:
  2. hdcStatic = (HDC)wParam;
  3. SetTextColor( hdcStatic, RGB(0x41, 0x96, 0x4F) ); //翠绿色
  4. SetBkMode(hdcStatic, TRANSPARENT); //透明背景
  5. return (INT_PTR)GetStockObject(NULL_BRUSH); //无颜色画刷

运行效果:

修改static控件背景颜色和文字颜色的更多相关文章

  1. MFC解决Static控件背景透明时文本覆盖重影

    通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与 ...

  2. c#winform中如何修改ListView控件每个单元格的颜色

    ListView在View属性为Details的时候它呈现的方式和DataGirdView差不多,它的每一行都是一个ListViewItem,然而每个ListViewItem都有一个BackColor ...

  3. static 控件颜色修改

    在对话框上放一个StaticText控件后如果文字长度不能铺满控件的 rect,如下: 那么运行时会出现如下效果 通过MSG_WM_CTLCOLORSTATIC消息修改static控件背景色模式为透明 ...

  4. VC OnCtlColor函数来修改控件背景颜色

    CWnd::OnCtlColor afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值:OnCtlColor必须 ...

  5. win32 修改Edit控件文本颜色与背景色

    #define WM_CTLCOLORMSGBOX 0x0132 #define WM_CTLCOLOREDIT 0x0133 //编辑控件Edit #define WM_CTLCOLORLISTBO ...

  6. iOS开发——UI高级OC篇&自定义控件之调整按钮中子控件(图片和文字)的位置

    自定义控件之调整按钮中子控件(图片和文字)的位置 其实还有一种是在storyBoard中实现的,只需要设置对应空间的左右间距: 这里实现前面两种自定义的方式 一:imageRectForContent ...

  7. C#控件背景透明的几种解决方案

    已经很少做winform程序了,最新参与了一个小项目,遇到了控件背景透明的功能要求,特在此总结一下,供有需要的同行参考. 0.背景透明的概念和分类 背景透明是啥意思呢,就是背景透明.哈哈,废话了.其实 ...

  8. 绘制n边形:用两个以上的控件来控制矩形的颜色、大小、位置及空实心(程序代写)

    绘制n边形:用两个以上的控件来控制矩形的颜色.大小.位置及空实心.(n由键盘输入) package lzy.di9zhang; import java.awt.BorderLayout;import ...

  9. Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

随机推荐

  1. BAT&注册表重定向劫持

    RunJS 常用引导,有时启动某个应用需要环境变量可以这样启动应用,会对启动的进程生效,即被继承 set PATH=D:\Developer\sdk\platform-tools;%PATH% D: ...

  2. notpad++快捷键

    Notpad++快捷键 Notepad++选中行操作 快捷键 使用技巧 作者: Rememberautumn 分类: 其他 发布时间: 2014-09-04 14:18 阅读: 60,106  微信小 ...

  3. MVC 基于FormsAuthentication 方式的权限验证

    1.登录的代码 1 [HttpPost] 2 public ActionResult Index(User entity) 3 { 4 User user = GetUser(entity.Name, ...

  4. (白书训练计划)UVa 11572 Unique Snowflakes(窗体滑动法)

    题目地址:UVa 11572 这样的方法曾经接触过,定义两个指针,不断从左向右滑动,推断指针内的是否符合要求. 这个题为了能高速推断是否有这个数,能够用STL中的set. 代码例如以下: #inclu ...

  5. MapReduce算法形式三:cleanup

    案例三:cleanup 其实这个案例可以不用写这么复杂,不用cleanup也能写,但是为了,突显,突显,突显(重要的事说四遍)cleanup的重要性,琢磨了半天,恩,这样写既可以突显cleanup又显 ...

  6. [译]Flutter JSON和序列化

    [译]Flutter JSON和序列化   很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据.制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON. 本指南介绍了如何 ...

  7. ajax访问json文件缓存问题

    ajax访问json文件,json文件改动,访问的时候也不能及时看到改动后的内容. 这是因为浏览器缓存的原因. 在这时候就需要清除浏览器的缓存或者加上一个标记,让ajax访问文件的时候知道这是一个新的 ...

  8. FileReader、 FileWriter、readLine()和newLine()、LineNumberReader(二十一)

    1.字符流FileReader * 1.字符流是什么 * 字符流是可以直接读写字符的IO流 * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出. ...

  9. html5--6-4 CSS选择器

    html5--6-4 CSS选择器 实例 学习要点 掌握常用的CSS选择器 了解不太常用的CSS选择器 什么是选择器 当我们定义一条样式时候,这条样式会作用于网页当中的某些元素,所谓选择器就是样式作用 ...

  10. HDU - 1269 迷宫城堡(有向图的强连通分量)

    d.看一个图是不是强连通图 s.求出强连通分量,看看有没有一个强连通分量包含所有点. c.Tarjan /* Tarjan算法 复杂度O(N+M) */ #include<iostream> ...