BEGIN_MESSAGE_MAP 写成 BEGIN_MESSAGE_MAP(Class, GrandParentClass) 会怎样?

What happens when BEGIN_MESSAGE_MAP is written as BEGIN_MESSAGE_MAP(Class, GrandParentClass)?

我遇到一段代码,其中 BEGIN_MESSAGE_MAP for a class 的第二个参数是 Grandparent Class。我知道当它是 parent class 时,如果 child class 不处理消息,它会检查 parent class做。我找不到有关 Grandparentclass 案例的文档。行为是否相似?它会跳过检查 parent class 的消息映射并检查 grandparent class 吗?

BEGIN_MESSAGE_MAP是一个宏,所以你可以看看展开的代码,看看它做了什么。确切的定义可能会随着版本的不同而不同,但还是多了还是lees:

#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
    const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap() \
        { return &baseClass::messageMap; } \
    const AFX_MSGMAP* theClass::GetMessageMap() const \
        { return &theClass::messageMap; } \
    AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
    { &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \
    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    { \

不太容易阅读...但是 baseClass 仅用于 non-virtual 函数 _GetBaseMessageMap,return 是底图。这在 return 中用于构建真正的 theClass::messageMap 的第一部分,即指向完整消息映射部分的指针列表(另一部分是此 class 的映射) ).

TL;DR;是的,对于任何未在此 class 中处理的消息,它将跳过 parent class 的映射并直接转到 grandparent class 的映射.