MFC 프로그래밍을 하다 보면 컨트롤을 상속받아 새롭게 재정의 하는 경우가 많다.

예를 들어 CTreeCtrl 을 상속 받는 CTestTreeCtrl 을 만든다고 한다면

class CTestTreeCtrl : public CTreeCtrl
{

}

이런 구조가 만들어진다.

문제는 NM_CLICK, TVN_ENDLABELEDIT 이런 통지 메시지들을 재정의 할때 원하지 않는

결과가 나오는 경우가 있다.

즉, 해당 클래스에서만 NM_CLICK 이 발생을 하고 해당 컨트롤의 부모윈도우에게는 NM_CLICK 이 발생하지 않는 현상이 나타나는것이다.

CTestTreeCtrl Class 에 NM_CLICK 를 재정의 하는 메서드를 만든다면 다음과 같이 될것이다.


protected:
//{{AFX_MSG(CTestTreeCtrl ) 
afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG BEGIN_MESSAGE_MAP(CTestTreeCtrl , CTreeCtrl)

//{{AFX_MSG_MAP(CTestTreeCtrl ) 
ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
//}}AFX_MSG_MAPEND_MESSAGE_MAP();

void CTestTreeCtrl ::OnClick(NMHDR* pNMHDR, LRESULT* pResult) {*pResult = 0;}

여기서 주의 깊게 봐야 하는 것이 바로

ON_NOTIFY_REFLECT(NM_CLICK, OnClick)

위 매크로다

MS 의 기술문서(KR600769) 에 보면 (http://support.microsoft.com/kb/600769/k)

ON_NOTIFY_REFLECT 는 부모 윈도우에 통지를 하지 않고 해당 클래스에서만

처리 하게끔 한다고 명시하고 있다.

부모 윈도우에까지 통지를 하고 싶다면 다음과 같이 변경 하면된다

ON_NOTIFY_REFLECT -> ON_NOTIFY_REFLECT_EX

afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
-> afx_msg BOOL OnClick(NMHDR* pNMHDR, LRESULT* pResult);

이렇게 반환 type 을 BOOL 로 변경하면 된다.

해당 메서드의

return 값이 FALSE 이면 부모에게 통지를 하고 TRUE 이면 부모에게 통지를 하지 않는다.

다른 카테고리의 글 목록

Programming/MFC 카테고리의 포스트 목록