c++ - 当控件定义了 ON_NOTIFY_REFLECT 时,ON_NOTIFY 在我的对话框中不起作用

标签 c++ mfc

在我的 CTreeCtrl 派生类中,我正在对 TVN_ITEMEXPANDED 进行操作:

ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, &OnTVNItemExpanded)

在控件的父对话框中,我还想对相同的通知 TVN_ITEMEXPANDED 执行操作,

ON_NOTIFY(TVN_ITEMEXPANDED, IDC_ELEMENT_TREE, &OnTVNItemExpanded)

但是,只有控件类的 OnTVNItemExpanded 方法被调用,而不是我的对话框的方法。我使用这两个断点并在这两种方法中查看所需的行为(或缺乏所需的行为),以验证仅调用了控件类的方法,而不是我的对话框的方法。

但是,如果我从 CTreeCtrl 派生的 BEGIN_MESSAGE_MAP 中注释掉 ON_NOTIFY_REFLECT,那么我的对话框的方法就会被调用!?!

为什么通知不能同时发送到我的控件和对话框?!?

最佳答案

ON_NOTIFY_REFLECT 覆盖 ON_NOTIFY,但您可以使用 ON_NOTIFY_REFLECT_EX 来代替,这让您的回调决定消息是否应该传递到父级.

参见Message Reflection for Windows Controls更详细的解释:

If, in your parent window class, you supply a handler for a specific WM_NOTIFY message or a range of WM_NOTIFY messages, your handler will be called only if the child control sending those messages does not have a reflected message handler through ON_NOTIFY_REFLECT(). If you use ON_NOTIFY_REFLECT_EX() in your message map, your message handler may or may not allow the parent window to handle the message. If the handler returns FALSE, the message will be handled by the parent as well, while a call that returns TRUE does not allow the parent to handle it. Note that the reflected message is handled before the notification message.

关于c++ - 当控件定义了 ON_NOTIFY_REFLECT 时,ON_NOTIFY 在我的对话框中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325358/

相关文章:

c++ - Excel 公式计算

winapi - 隐藏 MFC 对话窗口

c++ - Clang 和 GCC 在解析可变函数模板重载时的不同行为

c++ - 如何在 C++ 正则表达式中使用 Unicode 范围

MFC MDI - "Encountered an improper argument"

c++ - MFC:为什么加速器不起作用?

c++ - 需要帮助理解 MFC 项目

c++ - 如何正确删除一行控件并在该位置动态创建一个新控件?

c++ - 重载函数的特征

C++ 重写一个成员变量