gpt4 book ai didi

c++ - 了解 CStatic 和 CWnd 以及消息路由

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:01 24 4
gpt4 key购买 nike

我试图了解消息路由在 MFC 中的工作原理,但我对此有一些疑问。想象一个扩展 CWnd 的控件。我的第一个问题是:该控件中的所有消息是否都传递给了父控件?

我知道 CStatic 不会发生这种情况,它仅在您设置 SS_NOTIFY 样式时传递特定消息。我想了解的是 CStatic 特有的情况还是所有控件都会出现这种情况。具体来说,我正在尝试制作一个具有多个子控件的控件,其唯一目的是定义它们的布局。我希望子控件的所有消息都由该中间控件的父控件处理。例如,如果此布局控件有一个子按钮,则单击该按钮时,消息将发送给父级进行处理。

但是我不打算手动处理所有消息。那么,如果我从 CWnd 而不是 CStatic 扩展我的控制,消息会被传递吗? FORWARD_NOTIFICATIONS() 在 MFC 中可用吗?如果不是,我宁愿扩展我的中间类来根据需要处理消息。您还知道其他解决方案吗?

最佳答案

消息被发送到窗口本身。

一些窗口向它们的父窗口发送消息,通常以 WM_NOTIFY 消息的形式,或者(像按钮一样)以像 BN_CLICKED 这样的“特殊”消息的形式。

MFC 有一个系统(“反射”系统)让窗口将这些消息发送回窗口本身,这样您就可以在控件中处理消息而不是涉及父控件。

这就是它在抽象中的大致工作方式。您想要的(让父控件处理发送给所有子控件的所有消息)通常不是您“应该”做的。例如,您不希望将子窗口的所有 WM_PAINT 都发送给父窗口。

您想要做的(处理按钮点击)是不同的。按钮点击以 BN_CLICKED 的形式由按钮“发出”。无论如何,这些都将由 parent 处理。

如果你还是下定决心,可以接 pipe 窗口的WndProc做一些“过滤”。通常这是使用 PreTranslateMessage() 虚拟函数完成的。

关于c++ - 了解 CStatic 和 CWnd 以及消息路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503495/

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