반응형
MFC 프로그래밍을 하다 보면 컨트롤을 상속받아 새롭게 재정의 하는 경우가 많다.
예를 들어 CTreeCtrl 을 상속 받는 CTestTreeCtrl 을 만든다고 한다면
class CTestTreeCtrl : public CTreeCtrl
{
}
이런 구조가 만들어진다.
문제는 NM_CLICK, TVN_ENDLABELEDIT 이런 통지 메시지들을 재정의 할때 원하지 않는
결과가 나오는 경우가 있다.
즉, 해당 클래스에서만 NM_CLICK 이 발생을 하고 해당 컨트롤의 부모윈도우에게는 NM_CLICK 이 발생하지 않는 현상이 나타나는것이다.
CTestTreeCtrl Class 에 NM_CLICK 를 재정의 하는 메서드를 만든다면 다음과 같이 될것이다.
여기서 주의 깊게 봐야 하는 것이 바로
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);
이런 구조가 만들어진다.
문제는 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 이면 부모에게 통지를 하지 않는다.
해당 메서드의
return 값이 FALSE 이면 부모에게 통지를 하고 TRUE 이면 부모에게 통지를 하지 않는다.
'Programming > MFC' 카테고리의 다른 글
Excel Driver 사용한 CDatabase 오류 (0) | 2017.10.20 |
---|---|
무료 라인 차트 (0) | 2014.05.27 |
MFC 문자가 한글인지 검사/체크하는 방법들 (0) | 2013.01.30 |
UNICODE <-> ANSI 변환 (0) | 2011.11.24 |
ini 에서 섹션(Section) 정보 얻기 - GetPrivateProfileSectionNames (6) | 2010.08.13 |
CListCtrl 파일로 저장 - CListCtrl Save, Load (0) | 2010.08.12 |
CImageList Class (0) | 2008.10.08 |
MFC 에서 서로 다른 클래스의 핸들 얻어오기 (1) | 2008.05.30 |