WM_CTLCOLOR消息
文章参考地址: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消息相关推荐
- WM_CTLCOLOR消息重载
转载自: wangyao1052 的WM_CTLCOLOR消息 参考文章:白乔原创:VC之美化界面篇 在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOLOR通告消息,在该消息的处理函数中,可 ...
- .WM_CTLCOLOR和OnCtlColor消息的用法
在每一个控件需要被绘制时都会调用OnCtlColor,因此会被调用多次 对话框背景绘制时会被调用一次,其次是对话框上的子控件绘制时会调用! HBRUSH CMultiThreadDlg::OnCtlC ...
- MFC Windows 消息发送顺序
WM_CREATE 和 WM_INITDIALOG 什么时候发送的? 小结: WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个 ...
- 使用OnCtlColor函数消息打造背景
使用OnCtlColor函数消息打造背景 在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的 ...
- windows消息机制深入详解-1
Windows 是一个事件驱动的操作系统.事件驱动围绕着消息的产生与处 理展开,事件驱动是靠消息循环机制来实现的.也可以理解为消息是一种报告有关事件发生 的通知,消息是Windows 操作系统的灵魂. ...
- mfc编程消息机制中消息汇总
做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...
- 非模态对话框的销毁及消息的发送顺序
非模态对话框的销毁( 2010-12-28 19:21:33| 分类: vc | 标签: |字号大中小 订阅 void CTestDlg::OnCancel() { DestroyWindow() ...
- WM_INITDIALOG与WM_CREATE消息的区别
WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕(可以安全的使用这个窗口了,例如在它上面画控件等).在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说只是 ...
- mfc,WM_CTLCOLOR,WM_PAINT
1. WM_ERASEBKGND 绘制背景 WM_PAINT 绘制前景,就是一般的绘图 WM_CTLCOLOR 确切的说对于edit 其实是 WM_CTLCOLOREDIT ,反射消息,表示子控件绘制 ...
最新文章
- BTrace生产调试
- 面向对象分析和设计(OOA/D)
- 数据中台-阿里巴巴的数据整合、价值发掘、社会赋能之道
- cmake 编译mysql_CentOS5.6下使用cmake编译MySQL5.5.13源码和安装
- 【算法】Kruskal算法(解决最小生成树问题) 含代码实现
- WINCE下I/O操作基础
- JavaWeb笔记01-XML
- filter滤镜实现img图片的CSS蒙版效果、模糊效果
- Python IDLE换行写,一行写不下,如何换行继续写
- 智能家居火了这么久 何时到我家?
- SwipeRefreshLayout+RecyclerView滑动冲突解决
- 金蝶K3系统物料替代功能的应用与业务逻辑探讨
- 小程序云开发实战:从零搭建科技爱好者周刊小程序
- 世界上最权威的68句创业名言
- 用python实现阴阳师简单挂机脚本
- 具有硬件依赖性的计算机语言,具有硬件依赖性的计算机语言,被称为低级语言。下列哪些是低级语言?...
- 《黄昏清兵卫》中学到的工作态度
- 交易所通用质押式回购
- str.substring(0,str.length() -1)用法
- NP路由器——OE要点整理
热门文章
- JVM 调优实战--常用命令参数及PS收集器的GC日志格式
- Qt QGraphics体系及刷新机制介绍
- 【小米笔试题】朋友圈问题-并查集解法
- 拓扑排序(完整案列及C语言完整代码实现)
- noip 2017棋盘
- 3.1.6 OS之分页存储(页号、页偏移量等)
- 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
- linux mysql 5.7 双机热备_2017年5月5日 星红桉liunx动手实践mysql 主主双机热备
- java序列化异常_Java|序列化异常StreamCorruptedException的解决方法
- 数据结构与算法 / 哈希算法