Winapi ATL/WTL替代消息映射(ALT_MSG_映射)是如何工作的?我什么时候用?

Winapi ATL/WTL替代消息映射(ALT_MSG_映射)是如何工作的?我什么时候用?,winapi,visual-c++,atl,wtl,message-map,Winapi,Visual C++,Atl,Wtl,Message Map,我有一本书,上面写着: ATL支持使用ALT\u MSG\u MAP宏声明的备用消息映射。 每个备用消息映射都由一个唯一的编号标识,您可以将该编号传递给ALT\u MSG\u map 使用备用消息映射,您可以在一个映射中处理多个窗口的消息。 请注意,默认情况下,CWindowImpl不使用备用消息映射。 要添加此支持,请覆盖CWindowImpl派生类中的WindowProc方法,并使用消息映射标识符调用ProcessWindowMessage 当我查看WTL时,我会看到如下消息映射: BEGI

我有一本书,上面写着:

ATL支持使用
ALT\u MSG\u MAP
宏声明的备用消息映射。
每个备用消息映射都由一个唯一的编号标识,您可以将该编号传递给
ALT\u MSG\u 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\u MSG\u映射(1)
上方的行)

并非出于某种原因,该类希望处理父级的消息。它使用一个成员类变量对其进行子类化,此时需要定义消息处理程序。您不能将它们直接添加到同一个映射中,因为这会与它自己的窗口消息混淆

这就是备用地图的作用所在。父窗口消息路由到备用消息映射1


如果只处理自己窗口中的消息,则不需要其他映射。

ATL和WTL作为源代码提供。你可以阅读它来看看它是如何工作的。@RaymondChen:这就是我尝试过的(使用ATL和WTL),但我没有看到其他消息映射的引用。我看到消息映射被声明,但我无法说出它们是如何被调用的(对我来说,
ALT\u MSG\u MAP
的参数看起来像一个神奇的数字,在其他地方没有使用过),或者它们的要点是什么。
BEGIN\u MSG\u MAP
开始函数
ProcessWindowMessage
并打开一个switch语句
ALT_MSG_MAP
向switch语句添加新的大小写。说它是由
CContainedWindow
使用的,并给出了一个例子。@RaymondChen:这是有道理的,只是让我感到困惑的是,我在WTL中没有看到任何
CContainedWindow
的痕迹,而他们却不知何故在使用
ALT\u MSG\u MAP
:。。。或者我找错地方了?他们可能没有使用
CContainedWindow
,但他们确实使用了
CHAIN\u MSG\u MAP\u ALT
,这也使用了备用消息映射。