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

时间:2012-08-08 04:20:54

标签: winapi visual-c++ atl wtl message-map

read documentation,其中说:

  

ATL支持使用ALT_MSG_MAP宏声明的备用消息映射   每个备用邮件地图都由唯一编号标识,您可以将其传递给ALT_MSG_MAP   使用备用消息映射,您可以在一个映射中处理多个窗口的消息。
  请注意,默认情况下,CWindowImpl不使用备用消息映射   要添加此支持,请覆盖WindowProc派生类中的CWindowImpl方法,并使用消息映射标识符调用ProcessWindowMessage

当我查看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()

但是,我不明白:

  • 如何调用它们。 (代码如何知道备用消息映射的存在?)

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

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

有没有人对替代邮件地图有什么更好的解释? (他们被发明的原因很有帮助。)

1 个答案:

答案 0 :(得分: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)
    ...

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

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

这是备用地图的帮助之处。父窗口消息被路由到备用消息映射编号1。

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