5

我已阅读文档,其中说:

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()

但是,我不明白:

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

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

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

有人对备用消息映射的作用有更好的解释吗?
(为什么发明它们的动机会非常有帮助。)

4

1 回答 1

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。

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

于 2012-08-08T11:44:10.550 回答