在消息处理过程中,检查类自己的消息映射不是消息映射故事的结尾。 如果类 CMyView
(派生自 CView
)没有消息的匹配项,会发生什么情况?
CView
请记住,基类CMyView
从中派生。CWnd
因此CMyView
是一个CView
,也是一个CWnd
。 每个类都有自己的消息映射。 下图显示了类的分层关系,但请记住,对象 CMyView
是具有所有三个类特征的单个对象。
视图层次结构
如果类 CMyView
的消息映射中无法匹配消息,框架还会搜索其直接基类的消息映射。
BEGIN_MESSAGE_MAP
消息映射开头的宏指定两个类名作为其参数:
BEGIN_MESSAGE_MAP(CMyView, CView)
第一个参数将消息映射所属的类命名。 第二个参数提供与直接基类的连接,在本例 CView
中,框架也可以搜索其消息映射。
因此,基类中提供的消息处理程序由派生类继承。 这与普通虚拟成员函数非常相似,无需将所有处理程序成员函数设为虚拟。
如果未在任何基类消息映射中找到处理程序,则会执行消息的默认处理。 如果消息是命令,框架会将其路由到下一个命令目标。 如果它是标准 Windows 消息,则会将消息传递到相应的默认窗口过程。
为了加快消息映射匹配的速度,框架将缓存最近匹配项,使其再次收到同一消息的可能性。 其一个后果是框架可以有效地处理未经处理的消息。 消息映射也比使用虚拟函数的实现更具空间效率。