了解CStatic和CWnd以及消息路由
Understanding CStatic and CWnd and message routing
我试图了解消息路由如何在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.
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 重新定义预定义的 errno 错误消息 (E2BIG)
- NS2:AODV路由消息停留在队列中
- 了解CStatic和CWnd以及消息路由