1

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

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

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

4

2 回答 2

1

消息被发送到窗口本身。

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

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

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

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

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

于 2011-12-21T10:16:59.633 回答
0

您需要使用通知,这意味着使用附加结构中指定的您自己的代码发送WM_NOTIFY消息。然后,您的父控件可以使用 处理消息,或者您可以让所有者类使用ON_NOTIFY_REFLECTON_NOTIFY自己处理消息。

您总是可以避免使用 Windows\MFC 消息传递体系结构,而改用基于事件的系统。类似Boost.Signals2的东西。在我们的应用程序中,我们混合使用WM_NOTIFY消息和 Boost.Signals2。

于 2011-12-14T13:13:10.707 回答