ATL/WTL替代消息映射(ALT_MSG_MAPs)如何工作?我什么时候使用它们?

Meh*_*dad 4 winapi wtl atl visual-c++ message-map

我已经阅读文档,其中说:

ATL支持使用ALT_MSG_MAP宏声明的备用消息映射.
每个备用消息映射都由您传递给的唯一编号标识ALT_MSG_MAP.
使用备用消息映射,您可以在一个映射中处理多个窗口的消息.
请注意,默认情况下,CWindowImpl不使用备用消息映射.
要添加此支持,请覆盖-derived类中的WindowProc方法,CWindowImplProcessWindowMessage使用消息映射标识符进行调用.

当我看到WTL时,我会看到如下消息映射:

BEGIN_MSG_MAP(CCommandBarCtrlImpl)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
    ...
ALT_MSG_MAP(1)   // Parent window messages
    MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
    ...
ALT_MSG_MAP(2)   // MDI client window messages
    // Use CMDICommandBarCtrl for MDI support
ALT_MSG_MAP(3)   // Message hook messages
    MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)
    ...
END_MSG_MAP()
Run Code Online (Sandbox Code Playgroud)

但是,我不明白:

  • 他们如何被召唤.(代码如何知道备用消息映射的存在?)

  • 它们与默认消息映射的区别.他们看起来都像是为同一个窗口处理相同类型的消息......

  • 为什么它们有用.(它们不是都在同一个窗口吗?)

有没有人对替代消息映射有什么更好的解释?
(他们被发明的原因很有帮助.)

Rom*_* R. 5

备用消息映射让您在同一映射中为其他窗口的消息定义消息处理程序.看看上面的地图:

BEGIN_MSG_MAP(CCommandBarCtrlImpl)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
    ...
ALT_MSG_MAP(1)   // Parent window messages
    MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
    ...
Run Code Online (Sandbox Code Playgroud)

这是类CCommandBarCtrlImpl,它有一个与之关联的窗口句柄,HWND.所有消息都通过默认地图(上面的行ALT_MSG_MAP(1)).

不是出于某种原因,该类想要处理父级的消息.它使用成员类变量对其进行子类化,并且您需要定义消息处理程序.您无法将它们直接添加到同一个地图中,因为它会与自己的窗口消息混淆.

这是替代地图的帮助.父窗口消息被路由到备用消息映射编号1.

如果您只处理自己窗口的消息,则不需要备用地图.