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

相关文章
|
1月前
|
Go
go语言中遍历映射(map)
go语言中遍历映射(map)
51 8
|
25天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
33 12
|
29天前
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
36 2
|
6月前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
38 3
|
3月前
|
数据处理 Python
Pandas中的map函数应用
Pandas中的map函数应用
24 2
WK
|
3月前
|
Python
map函数
在Python中,`map()` 是一个内置的高阶函数,接受一个函数和一个或多个可迭代对象作为参数,将指定函数应用于每个元素,并返回包含应用结果的迭代器。若有多个可迭代对象,其元素会并行地传递给函数。`map()` 返回一个迭代器,需用 `list()` 转换。在Python 3中,`map()` 返回迭代器而非列表,并支持 `lambda` 表达式,适用于多种应用场景。注意,当输入的可迭代对象长度不同时,结果仅包含最短对象的长度。
WK
43 1
|
3月前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
42 5
|
5月前
|
存储 算法 C++
C++一分钟之-扁平化映射与unordered_map
【7月更文挑战第5天】C++的STL `unordered_map`是键值对的快速查找容器,基于哈希表。常见问题包括哈希函数选择、键类型限制、内存管理和迭代顺序不确定性。要避免问题,需优化哈希函数,确保自定义类型支持哈希和比较操作,合理管理内存,不依赖迭代顺序。提供的代码示例展示了如何为自定义类型定义哈希函数并操作`unordered_map`。正确使用能提升代码效率。
60 0
C++一分钟之-扁平化映射与unordered_map
|
6月前
|
存储 算法 C++
C++一分钟之-扁平化映射与unordered_map
【6月更文挑战第30天】`std::unordered_map`在C++中提供O(1)平均操作的无序键值对存储。文章讨论了扁平化映射,用于简化多级数据结构,例如将配置文件展平。常见问题包括哈希碰撞、内存管理和键类型选择。示例展示了如何创建和访问扁平化配置映射。通过理解哈希冲突解决、内存管理和键要求,可以优化使用。
69 0
|
6月前
|
JavaScript 前端开发
JavaScript 数组的函数 map/forEach/reduce/filter
JavaScript 数组的函数 map/forEach/reduce/filter