본문 바로가기
1_ 맛있는프로그래밍/C# and Visual C++

MFC - 메세지맵을 사용하지 않고 WM_메세지 처리

by 준환이형님 2011. 3. 24.

학교에서 MFC 수업을 들으며 그동안 대충알고 지나쳤던 내용을 차근차근 의미를 되새기고 있답니다.

상속과 오버라이딩이면 충분한데 왜 가상함수 이야기 할 때마다 다형성 이야기를 하실까.. 의아했었죠..

새삼 느끼는 거지만 답을 맞추는 것과 실제 이해해서 코딩 할수 있는 것은 큰 차이가 있는 것 같아요. 

가상함수를 정확히 이해하지 못하고 있던 중

오늘 요상한 MFC 예제 하나로 펑~ 이해가 감..

MFC에는 '메세지맵'이라는.. 윈도우메세지 리스트를 나열해 놓은 (특이한 형식의)함수가 하나 있는데 이것을 사용하지 말고 메세지(마우스를 누른다던지 창을 다시그린다던지)를 해 보라는 당황스런 문제가 주어진 것입니다.. 

이것을 해결하기 위해서는 CWnd클래스에 있는 PreTranslateMessage(MSG* pMsg)를 상속하여 변경(오버라이딩)해야 하는데

상속받아 새로변경시킨 자녀를 실행하기 이전에 부모가 먼저 실행되게 되는데.. 그게 컴파일 순서때문이라고 하더군요.(전문 용어가 있었는데 뭐였더라;;;)

그래서 우선 

virtual BOOL PreTranslateMessage(MSG* pMsg);

이 함수를 가상으로 지정을 하면.. 비로소 자녀에게 우선권이 주어지죠..

BOOL CHelloApp(자녀클래스)::PreTranslateMessage(MSG* pMsg)   
{  
if (pMsg->message == WM_LBUTTONDOWN){  
       MessageBox(NULL,"선택하시겠습니까?", "마우스 메시지", MB_OK );
         
  return TRUE;           
    }        
    return 0;
}  
 
이렇게 ㅋㅋ 실행해보면 컴파일 되어서 신기했음 ㅋㅋ

학교에서 얻는 배움 하나하나가 소소한 즐거움을 주는군요 ^ㅡ^