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

时间:2014-12-05 22:00:49

标签: 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,那么我的对话框方法就会被调用!?!

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

1 个答案:

答案 0 :(得分:3)

ON_NOTIFY_REFLECT会覆盖ON_NOTIFY,但您可以使用ON_NOTIFY_REFLECT_EX代替,让您的回调决定邮件是否应该传递给父级。

有关更详细的说明,请参阅Message Reflection for Windows Controls

  

如果在父窗口类中为特定提供了处理程序    WM_NOTIFY 消息或一系列 WM_NOTIFY 消息,您的处理程序将   只有在子控件发送这些消息时才会被调用   通过 ON_NOTIFY_REFLECT()有一个反映的消息处理程序。如果你   在消息映射中使用 ON_NOTIFY_REFLECT_EX(),消息处理程序   可能允许也可能不允许父窗口处理该消息。如果   handler返回 FALSE ,消息将由父进程处理   好吧,虽然返回 TRUE 的通话不允许父母进行   处理它。请注意,反映的消息在之前处理   通知信息。