2013-03-14 1 views
1

У меня есть свой собственный список управления списком WTL.Как определить изменение выбора в моем WTL :: CListViewCtrl, а не в родительском?

CPopupList : public CWindowImpl<CPopupList, WTL::CListViewCtrl>, 

Это прекрасно работает, за исключением одного: я хочу поймать уведомление при изменении выбора. Не в родительском окне (например: How to detect a CListCtrl selection change?), но в самом CPopupList, а затем выполните некоторые действия.

На самом деле, я хочу, чтобы появилось небольшое окно подсказки рядом с выбранным в данный момент элементом в качестве дополнительной информации о текущем элементе. Точно так же, как VS во время автозаполнения, давая больше информации о функциях/свойствах.

У кого-нибудь есть советы, как это сделать? спасибо.


Update:

Пробовал:

BEGIN_MSG_MAP(CPopupList) 
    REFLECTED_NOTIFY_CODE_HANDLER(LVN_ITEMCHANGED, OnListItemChanged) 
    DEFAULT_REFLECTION_HANDLER() 
END_MSG_MAP() 

Но OnListItemChanged() не вызывается. В родителю

REFLECT_NOTIFICATIONS() 

добавляется.


Update2 - РЕШЕНИЕ

Я нашел проблему:

родителя MSG_HANDLER:

BEGIN_MSG_MAP(CEditorCtrl) 
    MESSAGE_RANGE_HANDLER(WM_KEYFIRST,WM_KEYLAST,DelegateMessages) 
    ... 
    MESSAGE_ 
    ... 
    NOTIFY_CODE_HANDLER(LVN_ITEMCHANGED,OnListItemChanged) 
    CHAIN_MSG_MAP(parentType) 
    ALT_MSG_MAP(11) 
    COMMAND_HANDLER(IDC_PRINT_MONOCHROME,BN_CLICKED,OnPrintMonochromeButton) 
    REFLECT_NOTIFICATIONS() 
END_MSG_MAP() 

Перемещение REFLECT_NOTIFICATIONS() над ALT_MSG_MAP (11), и, наконец, OnListItemChanged вызывается в элементе управления.

Правильно:

REFLECT_NOTIFICATIONS() 
    ALT_MSG_MAP(11) 
    COMMAND_HANDLER(IDC_PRINT_MONOCHROME,BN_CLICKED,OnPrintMonochromeButton) 

ответ

2

Сообщение отправляется уведомление родителей в любом случае, вы не можете изменить это. То, что вы обычно делаете, - это отражение сообщений от родителя к ребенку, чтобы [улучшенный] ребенок мог следить за уведомлением, созданным его предком.

Родительское окно будет иметь отражающий обработчик на карте сообщения:

#include <atlcrack.h> 

BEGIN_MSG_MAP_EX(CMyDialog) 
    // ... 
    REFLECT_NOTIFICATIONS() 
END_MSG_MAP() 

И управление будет иметь обработчик для WM_NOTIFY уведомлений отражаемого управления родителем:

BEGIN_MSG_MAP_EX(CPopupList) 
    // ... 
    //MSG_OCM_CTLCOLORSTATIC(OnReflectedCtlColorStatic) // Reflected WM_CTLCOLORSTATIC 
    MSG_OCM_NOTIFY(OnReflectedNotify) // Reflected WM_NOTIFY 
    DEFAULT_REFLECTION_HANDLER() 
END_MSG_MAP() 

OnReflectedNotify где ты может обрабатывать уведомления элемента управления, но родитель отвечает за их пересылку (с собственной обработкой или без нее).

См. Также описание этого кода на CodeProject в WTL macros for handling reflected messages.

+0

Спасибо. Мой комментарий, как BEGIN_MSG_MAP_EX, так и MSG_OCM_NOTIFY, дает синтаксическую ошибку во время компиляции. BEGIN_MSG_MAP без _EX работает. Что я пробовал: REFLECTED_NOTIFY_CODE_HANDLER (LVN_ITEMCHANGED, OnListItemChanged) Я буду обновлять этот вопрос Но не работает – Zotyi

+0

Вам нужно '#include ' (файлы WTL в) –

+0

'BEGIN_MSG_MAP_EX' является повышение WTL для ATL в' BEGIN_MSG_MAP' –

Смежные вопросы