2008-10-14 5 views
5

나는 그 차이가 OnSize (..) 함수의 MFC에서 다음 두 메시지 트랩 사이에 무엇이 있는지 궁금해했다.MFC에서 메시지 트래핑 - 차이점은 무엇입니까?

1 - 비아 메시지지도 :

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
... 
    ON_WM_SIZE() 
.. 
END_MESSAGE_MAP() 

2 - afx_message 통해 :

afx_msg type OnSize(...); 

그들은 상호 교환 적으로 사용하는 것, 하나를 사용해야하거나 기타 요인에 따라 달라 하는가?

답변

12

메시지 처리기를 클래스에 추가하려면 두 부분이 모두 필요합니다. 메시지 맵은 클래스 내부에서 모든 메시지 핸들러 함수에 대한 선언 (예 : OnSize)과 함께 선언해야합니다. 실제로 아무것도하지 않고, 항상 규칙에 따라 포함되어 있습니다 -

class CClassWnd : public CBaseClassWnd { 
    ... 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    DECLARE_MESSAGE_MAP 
}; 

afx_msg 그냥 빈 자리 표시 자 매크로입니다.

메시지 맵

다음 클래스의 .cpp 파일에 정의되어

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

이러한 매크로 창에서 수신 메시지는 해당 핸들러 함수에 파견 할 수있는 클래스의 조회 테이블을 생성합니다. ON_WM_SIZE 매크로를 사용하면 WM_SIZE 메시지의 wParamlParam 메시지 매개 변수를 메시지 처리기 기능 (이 경우 nType, cxcy)에 대해보다 의미있는 값으로 디코딩 할 수 있습니다. MFC는 대부분의 창 메시지 (WM_LBUTTONDOWN, WM_DESTROY 등)에 대한 매크로를 제공합니다.

MSDN의 MFC here에서 메시지 맵이 작동하는 방식에 대한 자세한 정보를 찾을 수 있습니다.

3

afx_msg는 단지 빈 매크로로, 기본적으로 메서드가 가독성을 위해 MFC 메시지 처리기임을 나타냅니다. afx_msg를 사용하더라도 메시지 맵에 항목이 있어야합니다.

+0

내가 그것을 잠시 궁금해 한 것을 알기가 좋다. 어쩌면 나는 단지 내 손에 너무 많은 시간을 ....) –

0

일부 Windows 메시지는 이미 MFC에 의해 처리되므로 이러한 경우 파생 클래스에 메서드를 추가하는 것으로 벗어날 수 있습니다.

는 예를 들어, 하여 CWnd 클래스는 (다른 많은 MFC 클래스처럼) 이미 몇 가지의 윈도우 메시지를 매핑 메시지 맵입니다 (즉 ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE 등, 등).

그러나 아직 MFC에 의해 매핑되지 않은 다른 메시지는 클래스 메서드와 메시지 맵에 항목이 있어야 작동 할 수 있습니다.

관련 문제