消息映射的说明
An Explanation of Message Maps
我来自C#背景,正在调试一些遗留C++代码。我的谷歌技能让我失望了,或者我对结果缺乏理解,但谁能简要解释一下消息映射的用途? 非常感谢
本机 Win32 API 通过消息传递工作。特别是,应用程序具有一个或多个消息队列。它使用GetMessage()
检索消息。每条消息都有一个类型。
在旧代码中,消息处理代码以switch(msg.message)
开头。这个开关语句并不适合MFC预期的灵活性。它用消息映射替换了switch
语句,但两者都具有相同的基本目的:将每个消息类型调度到相应的处理程序。
主要原因是虚函数无法轻松地将消息 ID 映射到您编写的函数,可能与控件 ID 结合使用,然后再与特定命令 ID 结合使用。
经典的Win32代码向我们展示了一个带有大型开关案例块的窗口过程(WinProc)。它们再次分离成开关大小写块,用于WM_COMMAND消息。
使用消息映射,虚拟函数的大映射不会有代码膨胀。此外,消息映射还允许 MFC 代码查看是否可以处理消息。
此外,当新消息应包含在消息传递系统中时,它们还允许轻松扩展。
MFC 的文档有一个简短的说明:
在传统的Windows程序中,Windows消息在窗口过程中的大型switch语句中处理。MFC 改为使用消息映射将直接消息映射到不同的类成员函数。为此,消息映射比虚拟函数更有效,它们允许消息由最合适的C++对象(应用程序、文档、视图等)处理。您可以映射单个消息或一系列消息、命令 ID 或控件 ID。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- 如何从存储在std::映射中的std::集中删除元素
- 递归无序映射
- 消息映射的说明