了解CStatic和CWnd以及消息路由

Understanding CStatic and CWnd and message routing

本文关键字:消息 路由 CWnd CStatic 了解      更新时间:2023-10-16

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

我知道这不会发生与CStatic,它只传递特定的消息,当你设置SS_NOTIFY样式。我想了解的是,如果这是特定于CStatic或发生与所有的控件。具体来说,我试图使一个控件有几个子控件的唯一目的是定义他们的布局。我希望子控件的所有消息都由这个中间控件的父控件处理。例如,如果这个布局控件有一个子按钮,当按钮被单击时,消息将被发送到父控件进行处理。

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

消息被发送到窗口本身。

一些窗口发送消息给它们的父窗口,通常以WM_NOTIFY消息的形式,或者(像按钮)在'特殊'消息中,如BN_CLICKED。

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

这大致是抽象的工作方式。你想要的(有一个父控件处理发送到所有子控件的所有消息)通常不是你"应该"做的。例如,你不希望所有子窗口的WM_PAINT都被发送给父窗口。

你想要做的(处理按钮点击)是不同的。按钮点击是由按钮以BN_CLICKED的形式"发出"的。无论如何,这些都将由父进程处理。

如果你仍然决定,你可以接管子窗口的windowproc来做一些"过滤"。一般来说,这是使用PreTranslateMessage()虚拟函数完成的。

你需要使用通知,这意味着发送一个WM_NOTIFY消息与您自己的代码指定在附件结构。然后,您的父控件可以使用ON_NOTIFY处理消息,或者您可以让所有者类使用ON_NOTIFY_REFLECT处理消息本身。

你总是可以避免使用WindowsMFC消息传递架构,而使用基于事件的系统。比如Boost.Signals2。在我们的应用程序中,我们混合使用WM_NOTIFY消息和Boost.Signals2.