2013-03-14 4 views
1

내 자신의 WTL에서 파생 된 listcontrol이 있습니다.부모가 아닌 내 WTL :: CListViewCtrl에서 선택 변경 사항을 감지하는 방법은 무엇입니까?

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

한 가지를 제외하면 잘 작동합니다. 선택 항목이 변경되면 알림을 받고 싶습니다. 부모 창 (예 : How to detect a CListCtrl selection change?)이 아니라 CPopupList 자체에서 다음 작업을 수행하십시오.

사실 현재 선택한 항목 옆의 작은 힌트 창을 현재 항목의 추가 정보로 표시하려고합니다. 자동 완성 중에 VS가 함수/속성에 대한 추가 정보를 제공하는 것과 같습니다.

아무에게도이 작업을 수행하는 방법에 대한 팁이 있습니까? 대단히 감사합니다.


업데이트 : 시도

:

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

그러나 OnListItemChanged()가 호출되지 않습니다. 부모에서

REFLECT_NOTIFICATIONS() 

이 추가되었습니다.

부모의 MSG_HANDLER : -


갱신 2 해결

나는 문제가 발견

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() 

ALT_MSG_MAP (11) 위의 REFLECT_NOTIFICATIONS을() 이동을, 그리고 마지막으로 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 모두 컴파일 중에 구문 오류가 발생합니다.) _EX이없는 BEGIN_MSG_MAP이 작동합니다.내가 뭘하려 : REFLECTED_NOTIFY_CODE_HANDLER (LVN_ITEMCHANGED, OnListItemChanged) 를 내가 질문 를 업데이트합니다 그러나 당신이 필요로하는 – Zotyi

+0

작동하지 않습니다는에'#INCLUDE 는' –

+0

는'BEGIN_MSG_MAP_EX'는 ATL의'BEGIN_MSG_MAP' –