다음을 통해 공유


TN006: 메시지 맵

이 참고 MFC 메시지 맵 기능을 설명합니다.

문제

Microsoft Windows 메시징 기능을 사용 하 여 창 클래스에서 가상 함수를 구현 합니다.메시지와 관련 된 많은 때문에 각 Windows 메시지에 대 한 별도 가상 함수를 제공 하는 엄청나게 큰 vtable을 만들어야 합니다.

시스템 정의 Windows 메시지 수가 시간이 지남에 따라 변경 되므로 응용 프로그램에서 자신의 Windows 메시지를 정의할 수 있으므로 메시지 맵 인터페이스 변경 기존 코드를 수정 하는 것을 금지 하는 간접 참조 수준을 제공 합니다.

개요

MFC는 일반적인 Windows 기반 프로그램에서 사용한 창에 보내는 메시지를 처리 하는 switch 문 대신을 제공 합니다.메시지 창에 의해 수신 되 면 자동으로 적절 한 메서드 호출 되도록 메서드를 메시지에서 매핑을 정의할 수 있습니다.이 메시지 맵 기능 가상 함수를 유사 하 게 설계 되어 있지만 C++ 가상 함수에는 불가능 추가 이점이 있습니다.

메시지 맵을 정의합니다.

DECLARE_MESSAGE_MAP 매크로 3 클래스의 멤버를 선언 합니다.

  • 개인 배열을 AFX_MSGMAP_ENTRY 이라는 항목 _messageEntries.

  • 보호 AFX_MSGMAP 라는 구조 messageMap 가 가리키는 있는 _messageEntries 배열.

  • A 가상 함수 호출을 보호 GetMessageMap 는 반환 주소를 messageMap.

이 매크로 메시지 맵을 사용 하 여 클래스 선언에 저장 되어야 합니다.규칙에 따라 해당 클래스 선언의 끝입니다.예를 들면 다음과 같습니다.

class CMyWnd : public CMyParentWndClass
{
    // my stuff...

protected:
    //{{AFX_MSG(CMyWnd)
    afx_msg void OnPaint();
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};

이 새 클래스를 만들면 응용 프로그램 마법사와 클래스 마법사가 생성 합니다. 형식입니다./ / {{및 / /}} 괄호 클래스 마법사에 대해 필요 합니다.

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

이러한 두 매크로가 호출 간에이 메시지 맵에 의해 처리 되어야 하는 각 메시지에 대 한 항목이 있습니다.모든 표준 Windows 메시지 양식의 ON_WM_ 매크로 포함 된MESSAGE_NAME 는 해당 메시지에 대 한 항목이 생성 됩니다.

각 Windows 메시지의 매개 변수를 압축 하 고 형식 안전성을 제공 하는 표준 함수 시그니처 정의 되었습니다.이러한 서명은 afxwin.h에 선언 파일에서 찾을 수 있습니다의 CWnd.각각의 키워드로 표시 된 afx_msg 쉽게 식별 합니다.

[!참고]

클래스에 필요한 사용 하는 것은 afx_msg 메시지 맵 처리기 선언에서 키워드.

이러한 함수의 시그니처는 간단한 규칙을 사용 하 여 파생 된.함수의 이름을 항상로 시작 "On".Windows 메시지와 "WM_ 제거 는" 이름과 대문자로 각 단어의 첫 글자에서 나옵니다.매개 변수 순서는 wParam 뒤 LOWORD(lParam) 다음 HIWORD(lParam).사용 되지 않는 매개 변수는 전달 되지 않습니다.적절 한 MFC 개체에 대 한 포인터를 래핑하는 MFC 클래스에 의해 모든 핸들 변환 됩니다.다음 예제에서는 처리 하는 방법을 보여 줍니다.의 WM_PAINT 발생 하 고 메시지를 CMyWnd::OnPaint 함수를 호출할 수:

BEGIN_MESSAGE_MAP(CMyWnd, CMyParentWndClass)
    //{{AFX_MSG_MAP(CMyWnd)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

메시지 맵 테이블 범위 밖에 있는 함수나 클래스 정의 정의 되어야 합니다.Extern "C" 블록으로 배치 하면 안 됩니다.

[!참고]

ClassWizard 간에 발생 하는 메시지 맵 항목을 수정 합니다 있는 / / {{및 / /}} 주석 브래킷.

사용자 정의 Windows 메시지

사용자 정의 메시지만 포함 메시지 맵에서 사용 하 여 해당 ON_MESSAGE 매크로.이 매크로 메시지 번호 및 폼의 메서드를 사용할 수 있습니다.

    // inside the class declaration
    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()

이 예에서 우리는 Windows 메시지 id 표준에서 파생 된 사용자 지정 메시지에 대 한 처리기 설정 WM_USER 기본 메시지를 사용자 정의 합니다.다음 예제에서는이 처리기를 호출 하는 방법을 보여 줍니다.

CWnd* pWnd = ...;
pWnd->SendMessage(WM_MYMESSAGE);

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

[!참고]

입력 클래스 마법사 지원 하지 않습니다 ON_MESSAGE 처리기 루틴을 클래스 마법사 사용자 인터페이스에서.수동으로 해당 Visual C++ 편집기에서 입력 해야 합니다.클래스 마법사 이러한 항목을 구문 분석 하 고 이러한 다른 메시지 맵 항목 처럼 찾아보기 수 있도록 합니다.

등록 된 Windows 메시지

RegisterWindowMessage 함수는 시스템 전체에서 고유한 것으로 보장 하는 새 창 메시지를 정의 하는 데 사용 합니다.매크로 ON_REGISTERED_MESSAGE 이러한 메시지를 처리 하는 데 사용 됩니다.이 매크로의 이름을 사용할 수 있는 UINT NEAR 등록 된 windows 메시지 ID를 포함 하는 변수예

class CMyWnd : public CMyParentWndClass
{
public:
    CMyWnd();

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

    DECLARE_MESSAGE_MAP()
};

static UINT NEAR 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()

등록 된 Windows 메시지 ID 변수 (이 예제에서는 WM_FIND) 여야 합니다는 NEAR 변수는 방식으로 인해 ON_REGISTERED_MESSAGE 구현 됩니다.

이 방법을 사용 하는 사용자 정의 메시지의 범위를 0xC000 0xFFFF 범위의 됩니다.

[!참고]

입력 클래스 마법사 지원 하지 않습니다 ON_REGISTERED_MESSAGE 처리기 루틴을 클래스 마법사 사용자 인터페이스에서.수동으로 해당 텍스트 편집기에서 입력 해야 합니다.클래스 마법사 이러한 항목을 구문 분석 하 고 이러한 다른 메시지 맵 항목 처럼 찾아보기 수 있도록 합니다.

명령 메시지

메뉴 및 액셀러레이터 키 명령 메시지에 메시지 맵을 사용 하 여 처리 되는 ON_COMMAND 매크로.이 매크로 명령 ID와 방법을 사용할 수 있습니다.특정만 WM_COMMAND 메시지를 wParam 로 지정한 명령 ID 메시지 맵 항목에서 지정한 메서드에 의해 처리 됩니다.매개 변수 없이 사용 하 고 반환 하는 명령 처리기 멤버 함수 void.매크로 형식은 다음과 같습니다.

ON_COMMAND(id, memberFxn)

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

ON_UPDATE_COMMAND_UI(id, memberFxn)

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

이러한 양식의 예:

  • 내부 Resource.h (Visual C++에서 일반적으로 생성 됨)

    #define    ID_MYCMD      100
    #define    ID_COMPLEX    101
    
  • 클래스 선언 안에

    afx_msg void OnMyCommand();
    afx_msg void OnUpdateMyCommand(CCmdUI* pCmdUI);
    afx_msg BOOL OnComplexCommand(UINT nID);
    
  • 내부 메시지 맵 정의

    ON_COMMAND(ID_MYCMD, OnMyCommand)
    ON_UPDATE_COMMAND_UI(ID_MYCMD, OnUpdateMyCommand)
    ON_COMMAND_EX(ID_MYCMD, OnComplexCommand)
    
  • 구현 파일에

    void CMyClass::OnMyCommand()
    {
        // handle the command
    }
    
    void CMyClass::OnUpdateMyCommand(CCmdUI* pCmdUI)
    {
        // set the UI state with pCmdUI
    }
    
    BOOL CMyClass::OnComplexCommand(UINT nID)
    {
        // handle the command
        return TRUE;
    }
    

고급 사용자가 처리할 수 명령 범위의 단일 명령 처리기를 사용 하 여: ON_COMMAND_RANGE 또는 ON_COMMAND_RANGE_EX.이러한 매크로 대 한 자세한 내용은 제품 설명서를 참조 하십시오.

[!참고]

클래스 마법사 지원 만들기 ON_COMMANDON_UPDATE_COMMAND_UI 처리기가 있지만 지원 하지 않습니다 만들기 ON_COMMAND_EX 또는 ON_COMMAND_RANGE 처리기입니다.그러나 클래스 마법사 구문 분석 하 고 모든 네 개의 명령 처리기 변형 찾아보기 수 있습니다.

컨트롤 알림 메시지

자식 컨트롤 창에서 있는 추가 비트 정보의 메시지에서 전송 된 메시지 맵 엔트리: 컨트롤의 id입니다.메시지 맵 항목에 지정 된 메시지 처리기는 다음과 같은 경우에 호출 됩니다.

  • 컨트롤 알림 코드 (높은 단어의 lParam), 같은 BN_CLICKED를 메시지 맵 항목에 지정 된 알림 코드와 일치 합니다.

  • 컨트롤 ID (wParam) 메시지 맵 항목에 지정 된 컨트롤 ID와 일치 합니다.

사용자 지정 컨트롤 알림 메시지 수를 ON_CONTROL 메시지 맵 항목에 사용자 지정 알림 코드를 정의 하는 매크로.이 매크로 폼이

ON_CONTROL(wNotificationCode, id, memberFxn)

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

[!참고]

클래스 마법사를 만드는 지원 하지 않습니다는 ON_CONTROL 또는 ON_CONTROL_RANGE 사용자 인터페이스에 대 한 처리기입니다.수동으로 해당 텍스트 편집기로 입력 해야 합니다.클래스 마법사 이러한 항목을 구문 분석 하 고 여 방금 다른 메시지 맵 항목 처럼 찾아보기 수 있도록 합니다.

Windows 공용 컨트롤 사용 하는 보다 강력한 WM_NOTIFY 복합 컨트롤 알림.이 새 메시지에 대 한 직접 지원을 사용 하 여이 버전의 MFC 가진 해당 ON_NOTIFYON_NOTIFY_RANGE 매크로.이러한 매크로 대 한 자세한 내용은 제품 설명서를 참조 하십시오.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트