【====== MFC ====】2011. 9. 1. 14:42

메시지를 처리하는 함수 테이블을 정의 하는 매크로로
 
BEGIN_MESSAGE_MAP로 시작하여 END_MESSAGE_MAP로 끝나도록 정의하고
 
메시지가 전달되면 호출할 메시지 핸들러 함수 테이블을 정의하는 역할을 합니다.

전체적으로 구성을 설명하면
 
.h에 

class CMyDlg : public CDialog
 {
    ...
 
protected:
  // 생성된 메시지 맵 함수
  afx_msg void OnPaint();
  DECLARE_MESSAGE_MAP()
 };

다음과 같이 선언되면 DECLARE_MESSAGE_MAP 매크로로 인해

#define DECLARE_MESSAGE_MAP() \
 protected: \
  static const AFX_MSGMAP* PASCAL GetThisMessageMap(); \
  virtual const AFX_MSGMAP* GetMessageMap() const; \

클래스에는 GetThisMessageMap이라는 정적 멤버함수와 GetMessageMap() 멤버함수가 선언됩니다.
.cpp에는

BEGIN_MESSAGE_MAP과 END_MESSAGE_MAP은 각각 다음과 같이 정의되어 있는데
 
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
  PTM_WARNING_DISABLE \
  const AFX_MSGMAP* theClass::GetMessageMap() const \
   { return GetThisMessageMap(); } \
  const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
  { \
   typedef theClass ThisClass;         \
   typedef baseClass TheBaseClass;        \
   static const AFX_MSGMAP_ENTRY _messageEntries[] =  \
   {
 

#define END_MESSAGE_MAP() \
   {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
  }; \
   static const AFX_MSGMAP messageMap = \
   { &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; \
   return &messageMap; \
  }          \
  PTM_WARNING_RESTORE
  
BEGIN_MESSAGE_MAP은 GetMessageMap의 구현과
 
GetThisMessageMap의 함수를 시작하여
 
END_MESSAGE_MAP까지 AFX_MSGMAP_ENTRY라는 구조체를 이용하여
 
메시지 ID와 핸들러 함수의 관계를 나타내는 테이블을 구성합니다.

윈도우의 메시지가 발생할경우 메시지핸들러는 GetThisMessageMap을 통해 메시지 ID를 검사하여 핸들러 함수를 찾아 호출해줍니다.
 
#define ON_WM_PAINT() \
  { WM_PAINT, 0, 0, 0, AfxSig_vv, \
   (AFX_PMSG)(AFX_PMSGW) \
   (static_cast< void (AFX_MSG_CALL CWnd::*)(void) > ( &ThisClass :: OnPaint)) },

예를 들어 WM_PAINT라는 메시지가 윈도우에 전달되면 OnPaint를 호출해줍니다.


'【====== MFC ====】' 카테고리의 다른 글

[ MFC ] MFC란?  (0) 2011.08.02
Posted by RoaZium