派生消息映射

消息处理期间,检查类自己的消息映射是否是消息映射描述的结尾。 如果类 CMyView(派生自 CView)没有消息的匹配项,会发生什么?

记住,CViewCMyView 的基类)是依次从 CWnd 派生的。 因此,CMyViewCView,并且是 CWnd 这些类都有其自己的消息映射。 下图显示了类的层次关系,但记住,CMyView 对象是具有所有树类的特征的单个对象。

Diagram showing the hierarchy of a view.
视图层次结构

如果消息无法在类 CMyView 的消息映射中匹配,则框架还将在其即时基类中搜索消息映射。 位于消息映射开头的 BEGIN_MESSAGE_MAP 宏将指定两个类名称作为其参数:

BEGIN_MESSAGE_MAP(CMyView, CView)

第一个自变量命名消息映射所属的类。 第二个参数提供与即时基类(本例中为 CView)的关系,以便框架也可搜索其消息映射。

基类中提供的消息处理程序将由派生类集成。 这非常类似于标准虚拟成员函数,无需使所有处理程序成员函数成为虚拟。

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

为了加快消息映射匹配,框架将根据再次收到相同的消息的可能性缓存最近的匹配项。 这样做的一个结果就是框架将非常高效地处理未处理的消息。 消息映射还比使用虚函数的实现更省空间。

另请参阅

框架如何搜索消息映射