在我的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,那么我的对话框方法就会被调用!?!
为什么通知不能 到我的控件和我的对话框?!
答案 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 的通话不允许父母进行 处理它。请注意,反映的消息在之前处理 通知信息。