TN006: 메시지 맵

이 노트에서는 MFC 메시지 맵 시설。

문제

Microsoft Windows 이란 본질적으로 가상 함수 메시징 기능을 사용 하 여 창 클래스에 구현 합니다. 관련 된 메시지의 큰 숫자 때문에 엄청나게 큰 vtable 결과 각 Windows 메시지에 대 한 별도 가상 함수를 제공 하。

또한 시스템 정의 Windows 메시지 수가 시간이 지남에 따라 변경 이후 그리고 특정 응용 프로그램 자체의 일부 Windows 메시지를 정의 하고자 할 수 있습니다 이후 인터페이스 변경 기존 코드 침입 하지 못하도록 하는 간접 참조 수준을 메시지 맵 메커니즘 제공。

개요

MFC는 전통적인 Windows 프로그램에서 창에 보낸 메시지를 처리 하는 데 사용 하는 switch 문 대신을 제공 합니다. 적절 한 멤버 함수를 자동으로 호출 하 고 메시지 창에 의해 처리 될 때에 멤버 함수에 메시지에서 매핑을 정의할 수 있습니다. 이 메시지 지도 시설 가상 함수를 비슷한 수 있도록 설계 되었지만 추가 혜택 불가능 c + + 가상 함수。

메시지 맵 정의

클래스에 대 한 세 가지 멤버를 선언 하는 DECLARE_MESSAGE_MAP 매크로。

이 매크로 메시지 맵을 사용 하는 모든 클래스의 선언에 배치 되어야 합니다. 규칙에 따라 그것은 클래스 선언의 끝 에입니다. 예를 들어:

cMyWnd 클래스: 공용 CMyParentWndClass
{
 nbsp;? / / 내 물건...

보호 된:
 ?? //{{AFX_MSG(CMyWnd)
 ?? afx_msg OnPaint(); 무효
 ?? //}}AFX_MSG

DECLARE_MESSAGE_MAP()
}(&N)

AppWizard 및 Classwizard에서 새 클래스를 만들 때 생성 하는 형식입니다. / / {{고 / /}} 괄호 Classwizard에 필요한。

메시지 맵 테이블 메시지 맵 항목을 확장 하는 매크로의 집합으로 정의 됩니다. 이 메시지 맵을 처리 하는 클래스와 처리 되지 않은 메시지 전달 됩니다 부모 클래스를 정의 하는 BEGIN_MESSAGE_MAP 매크로 호출으로 시작 하는 테이블. END_MESSAGE_MAP 매크로 호출으로 끝나는 테이블。

이러한 두 가지 매크로 호출 사이이 메시지 맵에 의해 처리 되는 각 메시지에 대 한 항목이입니다. 모든 표준 Windows 메시지는 해당 메시지에 대 한 항목을 생성 하는 ON_WM_xxx (여기서 xxx는 메시지 이름을) 형태의 매크로。

각 Windows 메시지의 매개 변수를 풀고 형식 안전성을 제공에 대 한 표준 함수 서명을 정의 되었습니다. 이러한 서명은 AFXWIN 파일에서 찾을 수 있습니다.Cwnd의 선언에 H입니다. 각 하나 쉽게 식별할 수 있도록 word afx_msg 으로 표시。

메모nbsp;??ClassWizard afx_msg 키워드를 사용 하 여 메시지 맵 처리기 선언에서 필요로(&N)。

이러한 함수 서명은 간단한 규칙을 사용 하 여 파생 했다. 함수 이름은 항상 "On"으로 시작 됩니다. 이 제거 WM_ Windows 메시지의 이름, 유일한 뒤 각 단어의 첫 글자를 대문자로 표시 합니다. 매개 변수 순서는 wParam 이어서 LOWORD (lParam) 다음 HIWORD(lParam). 사용 하지 않는 매개 변수가 전달 되지 않습니다. MFC 클래스를 래핑하므로 모든 핸들이 적절 한 MFC 개체에 대 한 포인터 변환 됩니다. 다음 예제에서는 WM_PAINT 메시지를 처리 하는 발생 합니다 CMyWnd:: OnPaint 함수를 호출할 수

BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
 nbsp;? //{{AFX_MSG_MAP(CMyWnd)
 ?? ON_WM_PAINT()
 ?? //}}AFX_MSG_MAP
END_MESSAGE_MAP()(&N)

메시지 맵 테이블 함수 또는 클래스 정의의 범위 밖에 서 정의 되어야 합니다. Extern "C" 블록 안에 배치 되지 해야。

메모nbsp;??ClassWizard 사이 발견 되는 메시지 맵 항목을 편집할 것 이다는 / / {{고 / /}} 코멘트 브래킷(&N)。

사용자 정의 Windows 메시지

사용자 정의 메시지 ON_MESSAGE 매크로 사용 하 여 메시지 지도에 포함 될 수 있습니다. 이 매크로 메시지 번호 및 폼의 멤버 함수:

nbsp;???/ / 클래스 선언 안에
 ?? afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

예를 들어:
 ?? # define WM_MYMESSAGE (WM_USER + 100)

BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
 ?? ON_MESSAGE (WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()(&N)

이 예제에서 우리는 Windows 메시지 id는 표준 WM_USER 메시지 사용자 정의 대 한 기본에서 파생 된 사용자 지정 메시지에 대 한 처리기를 설정 합니다. 이 처리기 코드를 같은 호출 수 있습니다.:

CWnd * pWnd =...;
pWnd gt;SendMessage(WM_MYMESSAGE)(&G)

이 접근법을 사용 하 여 사용자 정의 메시지의 범위는 0x7fff WM_USER 범위에 있어야 합니다.

메모nbsp;??ClassWizard 마법사 사용자 인터페이스에서 입력 ON_MESSAGE 처리기 루틴을 지원 하지 않습니다: 당신은 Visual c + + 편집기에서 그들을 수동으로 입력 해야 합니다. ClassWizard 이러한 항목을 구문 분석 하 고 하면 다른 메시지 맵 항목 처럼 탐색 하는 일단 입력 하 고,(&N)。

등록 된 Windows 메시지

:: RegisterWindowMessage 함수는 시스템 전체에서 고유 해야 보장 하는 새 창 메시지를 정의 하는 데 사용 합니다. 매크로 ON_REGISTERED_MESSAGE 은 이러한 메시지를 처리 하는 데 사용 됩니다. 이 매크로 허용 된 등록된 창이 있는 가까운 UINT 변수 이름을 메시지 id입니다. 예를 들어

cMyWnd 클래스: 공용 CMyParentWndClass
{
공개:
 nbsp;? CMyWnd();

//{{AFX_MSG(CMyWnd)
 ?? afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);
 ?? //}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

정적 UINT 근처 WM_FIND = RegisterWindowMessage("COMMDLG_FIND");

BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
 ?? //{{AFX_MSG_MAP(CMyWnd)
 ?? ON_REGISTERED_MESSAGE (WM_FIND, OnFind)
 ?? //}}AFX_MSG_MAP
END_MESSAGE_MAP()(&N)

등록 된 Windows 메시지 ID 변수 (위의 예제에서 WM_FIND) 이어야 근처 변수 때문에 ON_REGISTERED_MESSAGE 구현 하는 방법。

이 접근법을 사용 하 여 사용자 정의 메시지의 범위 0xC000 0xFFFF 범위에 있을 것입니다.

메모nbsp;??ClassWizard 마법사 사용자 인터페이스에서 입력 ON_REGISTERED_MESSAGE 처리기 루틴을 지원 하지 않습니다, 그리고 당신은 수동으로 텍스트 편집기에서 그들을 입력 해야 합니다. ClassWizard 이러한 항목을 구문 분석 하 고 하면 다른 메시지 맵 항목 처럼 탐색 하는 일단 입력 하 고,(&N)。

명령 메시지

메뉴 및 액셀러레이터 명령 메시지 ON_COMMAND 매크로 메시지 맵에서 처리 됩니다. 이 매크로 멤버 함수 뿐만 아니라 명령 ID를 허용합니다. 지정 된 명령 ID 멤버 함수에 의해 처리 됩니다 크거나 wParam 과 특정 WM_COMMAND 메시지 메시지 맵 항목에 지정 된. 명령 처리기 멤버 함수 매개 변수를 받아 하 고 void를 반환 합니다. 매크로 폼:

 ON_COMMAND (id, memberFxn)

명령 업데이트 메시지 ON_COMMAND 처리기와 같은 메커니즘을 통해 라우팅됩니다. ON_UPDATE_COMMAND_UI 매크로 대신 사용 됩니다. 명령 업데이트 처리기 멤버 함수는 단일 매개 변수, CCmdUI 개체에 대 한 포인터를 사용 하 고 void를 반환. 매크로 폼

ON_UPDATE_COMMAND_UI (id, memberFxn)

명령 메시지 처리기의 확장 된 형태는 고급 용도로 사용할 수 있습니다. ON_COMMAND_EX 매크로 대신 사용 하 고 ON_COMMAND 기능의 상위 집합을 제공 합니다. 확장된 명령 처리기 멤버 함수는 단일 매개 변수, 명령 ID가 포함 된 UINT 고는 BOOL을 반환 합니다. 다른 명령 대상 개체를 계속 그렇지 않으면 라우팅 BOOL 반환 명령이 처리 되었습니다 나타내는 true 이어야 한다,。

위의 폼의 예:

단일 명령 처리기 명령 범위를 처리할 수 있는 ON_COMMAND_RANGE 및 ON_COMMAND_RANGE_EX 에 대 한 고급 사용에도 사용할 수 있습니다. 이러한 매크로에 대 한 자세한 내용은 제품 설명서를 참조 하십시오.

메모nbsp;??ClassWizard 만드는 ON_COMMAND 및 ON_UPDATE_COMMAND_UI 처리기를 지원 하지만 만드는 ON_COMMAND_EX 또는 ON_COMMAND_RANGE 처리기를 지원 하지 않습니다. 그러나 클래스 마법사는 구문 분석 하 고 모든 세 명령 처리기 변종 찾아보기 허용 하는,(&N)。

컨트롤 알림 메시지

창에 자식 컨트롤에서 여분의 비트 자신 들의 메시지에 있는 정보의 전송 되는 메시지 매핑 항목: 컨트롤의 id입니다. 메시지 맵 항목에 지정 된 메시지 처리기 BN_CLICKED, 등 (1) 컨트롤 알림 코드 (Lparam의 높은 단어) 메시지 맵 항목에 지정 된 알림 코드와 일치 하 고 (2) 컨트롤 ID (wParam) 메시지 맵 항목에 지정 된 컨트롤 ID와 일치 하는 경우에 호출。

사용자 지정 컨트롤 알림 메시지 ON_CONTROL 매크로 사용 하 여 사용자 지정 알림 코드와 메시지 맵 항목을 정의할 수 있습니다. 이 매크로 폼

ON_CONTROL (wNotificationCode, id, memberFxn)

고급 사용에 대 한 ON_CONTROL_RANGE 동일한 처리기를 사용 하 여 컨트롤의 범위에서 특정 컨트롤 알림을 처리 하기 위해 사용할 수 있습니다.

마법사 사용자 인터페이스에서 ON_CONTROL 또는 ON_CONTROL_RANGE 처리기를 만들기를 지원 하지 않습니다. 수동으로 텍스트 편집기와 함께 그들을 입력 해야 합니다. ClassWizard 이러한 항목을 구문 분석 하 고 하면 다른 메시지 맵 항목 처럼 탐색 하는 일단 입력 하 고,。

Windows 공용 컨트롤 더 강력한 WM_NOTIFY 복잡 한 제어 알림을 사용할 수 있도록 합니다. 이 버전의 MFC는 ON_NOTIFY 및 ON_NOTIFY_RANGE 매크로 함께이 새로운 메시지에 대 한 직접 지원 합니다. 이러한 매크로에 대 한 자세한 내용은 제품 설명서를 참조 하십시오.

기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)

Index