原创
MFC的消息反射及其应用技巧
2010-11-25 17:31
2727
13
14
分类:
软件与OS
在Windows中有一个改变控件颜色的消息WM_CTLCOLOR,该消息通常由父类窗口(一般是对话框,也可是框架窗口)接收并处理,其响应函数(通常加在CDialog派生类中)为:
afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);
由于参数nCtlColor只能识别控件的类别,如编辑控件CTLCOLOR_EDIT,列表框CTLCOLOR_LISTBOX等,也就是说,如果一个对话框中有几个编辑控件,那么其颜色改变是相同的。这显然不是用户所希望的结果,因为它不能改变具体某个控件的颜色。MFC(4.0以上)提出了一个解决办法:即采用“消息反射”,具体做法是Windows发出WM_CTLCOLOR消息,对话框类收到该消息后,再“反射”(Reflect)到其中每个控件子类中,并由子类处理反射函数:
afx_msg HBRUSH CtlColor(CDC *pDC,UINT nCtlColor);//注意与前面的函数名不同,而且少一个参数。
假设一个对话框中有2个编辑控件IDC_EDIT1和IDC_EDIT2,其类变量为m_edit1和m_edit2。现在需要改变IDC_EDIT2的颜色,先从CEdit类派生一个新类CMyEdit,在CMyEdit中加入消息WM_CTLCOLOR的发射消息:ON_WM_CTLCOLOR_REFLECT及响应函数:CtlColor(),在该函数中重新设置IDC_EDIT2控件的颜色(文本和背景),然后定义实例:CMyEdit m_edit2即可。
注意事项:
1、WIndows消息循环机制不提供消息反射功能,该功能只能在MFC4.0以上版本中通过用户程序实现,MFC4.0以下版本无此功能。
2、具有反射功能的Windows消息共有16条,常用的有:(其余的可参考MSDN)
ON_NOTIFY_REFLECT
ON_WM_CTLCOLOR_REFLECT
ON_WM_HSCROLL_REFLECT
ON_WM_VSCROLL_REFLECT
ON_WM_DRAWITEM_REFLECT
ON_WM_MEASUREITEM_REFLECT
ON_UPDATE_COMMAND_UI_REFLECT
3、在MFC4.0以下版本中,消息WM_DRAWITEM(自画控件)有一种类似消息反射的功能,即在控件类中重构虚拟函数:Virtual void DrawItem()(注意不是OnDrawItem),这一功能在MFC4.0以后也继承下来,由于此方法不用定义反射消息ON_WM_DRAWITEM_REFLECT,因此,大部分用户在其应用程序中仍使用此方法。
用户377235 2013-11-5 15:41