消息映射的说明

An Explanation of Message Maps

本文关键字:说明 映射 消息      更新时间:2023-10-16

我来自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。