了解CStatic和CWnd以及消息路由

时间:2011-12-14 11:09:34

标签: c++ windows mfc cwnd

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

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

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

2 个答案:

答案 0 :(得分:1)

消息将自动发送到窗口。

有些窗口会向父母发送消息,通常以WM_NOTIFY消息的形式发送,或者(如按钮)在“特殊”消息中发送消息,如BN_CLICKED。

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

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

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

如果您仍然坚定,可以接管子窗口的WndProc进行“过滤”。通常,这是使用PreTranslateMessage()虚函数完成的。

答案 1 :(得分:0)

您需要使用通知,这意味着发送WM_NOTIFY消息,其中包含您在附加结构中指定的代码。然后,您的父控件可以使用ON_NOTIFY处理邮件,或者您可以让所有者类使用ON_NOTIFY_REFLECT处理邮件本身。

您始终可以避免使用Windows \ MFC消息传递体系结构并使用基于事件的系统。像Boost.Signals2这样的东西。在我们的应用程序中,我们使用WM_NOTIFY消息和Boost.Signals2。

的混合