2014-12-05 14 views
0

在我CTreeCtrl的派生類中,我要表現的TVN_ITEMEXPANDED定義:ON_NOTIFY不是在我的對話框工作時,我曾ON_NOTIFY_REFLECT通過控制

ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, &OnTVNItemExpanded) 

在控件的父對話框,我也想在相同的作用通知TVN_ITEMEXPANDED,

ON_NOTIFY(TVN_ITEMEXPANDED, IDC_ELEMENT_TREE, &OnTVNItemExpanded) 

然而,只有控制類的OnTVNItemExpanded方法獲取調用,從來不是我的對話框的。我正在使用這兩個斷點,並在兩種方法中看到所需的行爲(或缺乏所需的行爲),以驗證只調用控件類的方法,而不是我的對話框的方法。但是,如果我從我的CTreeCtrl派生的BEGIN_MESSAGE_MAP註釋掉ON_NOTIFY_REFLECT,那麼我的對話框的方法被調用!!!

爲什麼不能通知這兩個到我的控制和我的對話?!?

回答

2

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(),則消息處理程序 可能允許或不允許父窗口處理消息。如果 處理函數返回FALSE ,該消息將被父爲 處理得好,而返回TRUE 一個通話不允許父 處理。請注意,反映的消息在 通知消息之前處理。