gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:14:32 25 4
gpt4 key购买 nike

我已经read documentation ,其中表示:

ATL supports alternate message maps, declared with the ALT_MSG_MAP macro.
Each alternate message map is identified by a unique number, which you pass to ALT_MSG_MAP.
Using alternate message maps, you can handle the messages of multiple windows in one map.
Note that by default, CWindowImpl does not use alternate message maps.
To add this support, override the WindowProc method in your CWindowImpl-derived class and call ProcessWindowMessage with the message map identifier.

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

但是,我不明白:

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

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

  • 为什么它们有用。 (无论如何,它们不都在同一个窗口吗?)

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

最佳答案

替代消息映射允许您在同一映射中为其他窗口的消息定义消息处理程序。看看上面的 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) 上方的行)。

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

这就是备用 map 可以提供帮助的地方。父窗口消息被路由到备用消息映射编号 1。

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

关于winapi - ATL/WTL 替代消息映射 (ALT_MSG_MAP) 如何工作?我什么时候使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11857611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com