我已经阅读了文档,其中说:
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。
如果您只处理自己窗口的消息,则不需要备用地图。