DECLARE_MESSAGE_MAP() 等消息映射宏以及 afx_msg消息映射函数

简介: DECLARE_MESSAGE_MAP() 等消息映射宏以及 afx_msg消息映射函数

一、DECLARE_MESSAGE_MAP(),BEGIN_MESSAGE_MAP(),END_MESSAGE_MAP()


DECLARE_MESSAGE_MAP()宏的作用是向类中添加消息i映射必要的结构体和函数声明,只需要添加一次,放在什么位置并不重要,就如同类里其他普通函数的声明可以相互交换顺序一样。


函数的修饰符也是可以自己决定的,遵循一般原则。比如你需要在类外部也可以调用该消息响应函数,就可以定义成public的。


但是其实真正的消息映射是在cpp文件里面的


BEGAIN_MESSAGE_MAP()


END_MESSAGE_MAP()


这两个宏之间


比如:


h:



cpp:



如上大体意思就是:只要是CCmdTarget(用于所有能够消息映射的基类)派生类,必有消息映射以处理消息,则在类的说明文件的尾部有DECLARE_MESSAGE_MAP宏,在类的定义文件中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以处理用户消息。

其中BEGIN_MESSAGE_MAP(参数1,参数2) ,参数1为该类的类名,参数2为该类基类的类名。


在一些资料上,也书面的说明为:


用户程序中的每个CCmdTarget派生类必须提供消息映射以处理消息。在类定义的末尾使用DECLARE_MESSAGE_MAP宏。接着,在定义类成员函数的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,及END_MESSAGE_MAP宏。


注(如果在DECLARE_MESSAGE_MAP之后定义任何一个成员,那么必须为他们指定一个新存取类型(公共的,私有的,保护的))


二、afx_msg函数


应用程序框架产生的消息映射函数


例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体;


而在map宏定义中,就有具体消息和此函数的映射定义(可以是自定义,也可以是系统自动完成的)


afx是 application framework


如定义一个Edit的Change处理函数:


也可参照以上文中图片例子


一、在类的头文件(*.h)中增加 :


  //{{AFX_MSG(CDialogDemo)   
  afx_msg  void OnChangeEdit1();
  //{{AFX_MSG   


二、在类的实现文件(*.cpp)中增加:


1.消息定义( ON_EN_CHANGE):


BEGIN_MESSAGE_MAP(CDialogDemo, CDialog)
//{{AFX_MSG_MAP()   
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
 //}}AFX_MSG_MAP   
END_MESSAGE_MAP()   


2.执行函数:


void CDialogDemo::OnChangeEdit1() 
{
 TODO: 添加你的控件相关代码
……
}  


在afxwin.h中afx_msg的解释:


 #ifndef   afx_msg  
  #define   afx_msg                   //   intentional   placeholder  
  #endif  


没什么意思.只是定义了这个符号而已. 这个对编译器来说,相当于什么都没有,对于人来说,我们可以看到这样的符号. 。


对于类向导来说.这个符号才是有意义的.它是一个消息处理函数的前缀. 类向导生成的消息函数,分发函数,事件响应函数都以这个为前缀.如果去掉了,向导将不能识别


三、自己添加的消息


如果是自己写的afx_msg函数,则需自己在cpp中添加消息处理代码


ON_MESSAGE(参数1,参数2)


其中参数1是自己定义的消息ID,参数2是函数名


例如:



其中消息ID是自己定义的



其中WM_USER宏定义可以看我的另一篇文章介绍


https://blog.csdn.net/weixin_45525272/article/details/106426221

相关文章
|
7月前
|
C++
使用 pragma message 查找多变的 DEBUG 宏
使用 pragma message 查找多变的 DEBUG 宏
|
11月前
|
存储
基于boost的bind与function的一个简单示例消息处理框架
前两年开始接触boost,boost库真是博大精深;今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了。
64 0
|
API Windows
宏定义WM_USER,与自定义宏WM_USER+100
宏定义WM_USER,与自定义宏WM_USER+100
126 0
message show_once这个标志位的用法
Sent: Monday, November 26, 2012 8:01 PM
117 0
message show_once这个标志位的用法
Qt信号槽使用结构体作为参数:Q_DECLARE_METATYPE和qRegisterMetaType的作用
Qt信号槽使用结构体作为参数:Q_DECLARE_METATYPE和qRegisterMetaType的作用
1350 0