派生消息映射

在消息处理过程中,检查类自己的消息映射不是消息映射故事的结尾。 如果类 CMyView (派生自 CView)没有消息的匹配项,会发生什么情况?

CView请记住,基类CMyView从中派生。CWnd 因此CMyView一个CView,也是一个CWnd。 每个类都有自己的消息映射。 下图显示了类的分层关系,但请记住,对象 CMyView 是具有所有三个类特征的单个对象。

显示视图层次结构的关系图。
视图层次结构

如果类 CMyView的消息映射中无法匹配消息,框架还会搜索其直接基类的消息映射。 BEGIN_MESSAGE_MAP消息映射开头的宏指定两个类名作为其参数:

BEGIN_MESSAGE_MAP(CMyView, CView)

第一个参数将消息映射所属的类命名。 第二个参数提供与直接基类的连接,在本例 CView中,框架也可以搜索其消息映射。

因此,基类中提供的消息处理程序由派生类继承。 这与普通虚拟成员函数非常相似,无需将所有处理程序成员函数设为虚拟。

如果未在任何基类消息映射中找到处理程序,则会执行消息的默认处理。 如果消息是命令,框架会将其路由到下一个命令目标。 如果它是标准 Windows 消息,则会将消息传递到相应的默认窗口过程。

为了加快消息映射匹配的速度,框架将缓存最近匹配项,使其再次收到同一消息的可能性。 其一个后果是框架可以有效地处理未经处理的消息。 消息映射也比使用虚拟函数的实现更具空间效率。

另请参阅

框架如何搜索消息映射