文章参考地址:http://blog.csdn.net/hisinwang/article/details/8070393

在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOLOR通告消息,在该消息的处理函数中,可以设置控件显示文本的前景色、背景色以及字体。该消息处理函数还要求返回一个画刷的句柄,用于在控件具体的绘制之前擦除其客户区。

WM_CTLCOLOR映射消息处理函数为afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)。
        常用代码为:

pDC->SetTextColor(RGB(255, 0, 0));    //设置文本前景色
pDC->SetBkColor(RGB(255, 255, 255));  //设置文本背景色
pDC->SetBkMode(TRANSPARENT);          //TRANSPARENT或OPAQUE
pDC->SelectObject(...)

简单示例如下:

//
//m_font1与m_font2为CTestDlg的成员,类型为CFont
//
BOOL CTestDlg::OnInitDialog()
{......// TODO: Add extra initialization herem_font1.CreatePointFont(120,  TEXT("Impact")); m_font2.CreatePointFont(120,  TEXT("Arial"));......
}HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO:  Change any attributes of the DC hereif (nCtlColor == CTLCOLOR_STATIC){switch (pWnd->GetDlgCtrlID()){case IDC_STATIC_1:pDC->SetTextColor(RGB(255, 0, 0));pDC->SetBkColor(RGB(255, 255, 255));pDC->SetBkMode(TRANSPARENT);pDC->SelectObject(&m_font1);return (HBRUSH)::GetStockObject(BLACK_BRUSH);break;case IDC_STATIC_2:pDC->SetTextColor(RGB(255, 255, 0));pDC->SetBkColor(RGB(255, 255, 255));pDC->SelectObject(&m_font2);return (HBRUSH)::GetStockObject(BLACK_BRUSH);break;default:break;}}// TODO:  Return a different brush if the default is not desiredreturn hbr;
}


 说明一:
OnCtlColor中的nCtlColor可为:
CTLCOLOR_BTN   Button controlCTLCOLOR_DLG   Dialog boxCTLCOLOR_EDIT   Edit controlCTLCOLOR_LISTBOX   List-box controlCTLCOLOR_MSGBOX   Message boxCTLCOLOR_SCROLLBAR   Scroll-bar controlCTLCOLOR_STATIC   Static control

可见,WM_CTLCOLOR可作用于按钮控件CButton、编辑框控件CEdit、ListBox控件、Static控件、滚动条控件,也可作用于对话框本身。
        注意:前面讲WM_CTLCOLOR为通告消息,也即是子控件发送给父窗口的,但对于对话框本身,它能收到nCtlColor为CTLCOLOR_DLG的WM_CTLCOLOR消息,这是自身发给自身的,显然,这时不是通告消息。

示例:

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO:  Change any attributes of the DC hereif (nCtlColor == CTLCOLOR_DLG)return (HBRUSH)::GetStockObject(BLACK_BRUSH);elsepDC->SetTextColor(RGB(255, 0, 0));// TODO:  Return a different brush if the default is not desiredreturn hbr;
}


    说明二
    OnCtlColor消息里面的处理对PushButton是不起作用的,由说明一中的示例效果也可以看出,而对CheckBox和RadioButton是OK的。附上CSDN给出的解释:Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight, and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button.所以,对PushButton只能将其设置为owner-drawn button,然后响应控件通告消息WM_DRAWITEM来处理,该消息的响应函数原型为afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)。

    说明三:对ComboBox控件的应用
    ComboBox控件包含一个EditBox,当单击展开的时候,会出现一个ListBox列出所有的项目,注意,这时ListBox控件的父窗口不是这个ComboBox,而是ComboBox的父窗口。所以,如果要在代码中设置某个ComboBox所显示文字的字体颜色为红色(EditBox以及下拉ListBox中的文字),假设该ComboBox的ID为IDC_COMBO,则使用如下代码将无任何作用。
if (pWnd->GetDlgCtrlID() == IDC_COMBO)
{pDC->SetTextColor(RGB(255, 0, 0));
}

EditBox以及下拉ListBox中的文字颜色均没有改变。
    以下对话框中有两个ComboBox控件m_combo1,m_combo2。现要使m_combo1中显示的文字颜色为红色,而m_combo2为默认。代码如下
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO:  Change any attributes of the DC here//对m_combo1的EditBox(该EditBox的父窗口为m_combo1)if (nCtlColor == CTLCOLOR_EDIT&& pWnd->GetParent()->GetDlgCtrlID() == m_combo1.GetDlgCtrlID()){pDC->SetTextColor(RGB(255, 0, 0));}//对m_combo1下拉的ListBoxif (nCtlColor == CTLCOLOR_LISTBOX&& m_combo1.GetParent()->GetDlgCtrlID() == pWnd->GetParent()->GetDlgCtrlID()){//获取ListBox和m_combo1的屏幕坐标范围
        RECT rectListBox;RECT rectComboBox;pWnd->GetWindowRect(&rectListBox);m_combo1.GetWindowRect(&rectComboBox);//如果该ListBox刚好在m_combo1的下面,则是单击m_combo1产生的下拉ListBoxif (rectListBox.left == rectComboBox.left&& rectListBox.top == rectComboBox.bottom){pDC->SetTextColor(RGB(255, 0, 0));}}// TODO:  Return a different brush if the default is not desiredreturn hbr;
}

效果如下:

    更简单的办法是:利用向导新增MFC类CMyComboBox : CComboBox,再增加WM_CTLCOLOR消息的响应函数。(注意:ComboBox下的EditBox和ListBox均会向ComboBox窗口发送WM_CTLCOLOR消息,如果在ComboBox对应的消息映射表没有找到对应的处理函数,再向CComboBox的父窗口发送WM_CTLCOLOR消息,具体可参考文章WM_NOTIFY消息流程实例分析)
BEGIN_MESSAGE_MAP(CMyComboBox, CComboBox)ON_WM_CTLCOLOR()
END_MESSAGE_MAP()HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);// TODO:  Change any attributes of the DC herepDC->SetTextColor(RGB(255, 255, 0));// TODO:  Return a different brush if the default is not desiredreturn hbr;
}

pDC->SetTextColor(RGB(255, 255, 0));一句代码就可以实现上面的功能。

    说明四、WM_CTLCOLOR为通告消息,所以也可以在反射消息中处理。
ON_WM_CTLCOLOR_REFLECT()

转载于:https://www.cnblogs.com/wuyuan2011woaini/p/4283422.html

WM_CTLCOLOR消息相关推荐

  1. WM_CTLCOLOR消息重载

    转载自: wangyao1052 的WM_CTLCOLOR消息 参考文章:白乔原创:VC之美化界面篇 在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOLOR通告消息,在该消息的处理函数中,可 ...

  2. .WM_CTLCOLOR和OnCtlColor消息的用法

    在每一个控件需要被绘制时都会调用OnCtlColor,因此会被调用多次 对话框背景绘制时会被调用一次,其次是对话框上的子控件绘制时会调用! HBRUSH CMultiThreadDlg::OnCtlC ...

  3. MFC Windows 消息发送顺序

    WM_CREATE 和 WM_INITDIALOG 什么时候发送的? 小结: WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个 ...

  4. 使用OnCtlColor函数消息打造背景

    使用OnCtlColor函数消息打造背景 在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的 ...

  5. windows消息机制深入详解-1

    Windows 是一个事件驱动的操作系统.事件驱动围绕着消息的产生与处 理展开,事件驱动是靠消息循环机制来实现的.也可以理解为消息是一种报告有关事件发生 的通知,消息是Windows 操作系统的灵魂. ...

  6. mfc编程消息机制中消息汇总

    做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...

  7. 非模态对话框的销毁及消息的发送顺序

    非模态对话框的销毁( 2010-12-28 19:21:33|  分类: vc |  标签: |字号大中小 订阅 void CTestDlg::OnCancel() { DestroyWindow() ...

  8. WM_INITDIALOG与WM_CREATE消息的区别

    WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕(可以安全的使用这个窗口了,例如在它上面画控件等).在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说只是 ...

  9. mfc,WM_CTLCOLOR,WM_PAINT

    1. WM_ERASEBKGND 绘制背景 WM_PAINT 绘制前景,就是一般的绘图 WM_CTLCOLOR 确切的说对于edit 其实是 WM_CTLCOLOREDIT ,反射消息,表示子控件绘制 ...

最新文章

  1. BTrace生产调试
  2. 面向对象分析和设计(OOA/D)
  3. 数据中台-阿里巴巴的数据整合、价值发掘、社会赋能之道
  4. cmake 编译mysql_CentOS5.6下使用cmake编译MySQL5.5.13源码和安装
  5. 【算法】Kruskal算法(解决最小生成树问题) 含代码实现
  6. WINCE下I/O操作基础
  7. JavaWeb笔记01-XML
  8. filter滤镜实现img图片的CSS蒙版效果、模糊效果
  9. Python IDLE换行写,一行写不下,如何换行继续写
  10. 智能家居火了这么久 何时到我家?
  11. SwipeRefreshLayout+RecyclerView滑动冲突解决
  12. 金蝶K3系统物料替代功能的应用与业务逻辑探讨
  13. 小程序云开发实战:从零搭建科技爱好者周刊小程序
  14. 世界上最权威的68句创业名言
  15. 用python实现阴阳师简单挂机脚本
  16. 具有硬件依赖性的计算机语言,具有硬件依赖性的计算机语言,被称为低级语言。下列哪些是低级语言?...
  17. 《黄昏清兵卫》中学到的工作态度
  18. 交易所通用质押式回购
  19. str.substring(0,str.length() -1)用法
  20. NP路由器——OE要点整理

热门文章

  1. JVM 调优实战--常用命令参数及PS收集器的GC日志格式
  2. Qt QGraphics体系及刷新机制介绍
  3. 【小米笔试题】朋友圈问题-并查集解法
  4. 拓扑排序(完整案列及C语言完整代码实现)
  5. noip 2017棋盘
  6. 3.1.6 OS之分页存储(页号、页偏移量等)
  7. 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
  8. linux mysql 5.7 双机热备_2017年5月5日 星红桉liunx动手实践mysql 主主双机热备
  9. java序列化异常_Java|序列化异常StreamCorruptedException的解决方法
  10. 数据结构与算法 / 哈希算法