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



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

ATL 支持使用 ALT_MSG_MAP 宏声明的备用消息映射。
每个备用消息映射都由一个唯一的编号标识,您可以将该编号传递给 ALT_MSG_MAP
使用备用消息映射,您可以在一个映射中处理多个窗口的消息。
请注意,缺省情况下,CWindowImpl不使用备用消息映射。
要添加此支持,请重写 CWindowImpl 派生类中的 WindowProc 方法,并使用消息映射标识符调用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()

但是,我不明白:

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

  • 它们与缺省消息映射有何不同。它们看起来都像是在为相同的窗口处理相同类型的消息......

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

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

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

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。

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

相关内容

  • 没有找到相关文章

最新更新