이 노트에서는 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 이어야 한다,。
위의 폼의 예:
#definenbsp;?? ID_MYCMD 100
# define ID_COMPLEX 101(&N)
afx_msg OnMyCommand(); 무효
afx_msg void OnUpdateMyCommand (CCmdUI * pCmdUI);
BOOL OnComplexCommand(UINT nID) afx_msg
ON_COMMAND (ID_MYCMD, OnMyCommand)
ON_UPDATE_COMMAND_UI (ID_MYCMD, OnUpdateMyCommand)
ON_COMMAND_EX (ID_MYCMD, OnComplexCommand)
void CMyClass::OnMyCommand()
{
nbsp;? / / 명령을 처리
}
void CMyClass::OnUpdateMyCommand (CCmdUI * pCmdUI)
{
?? / / Pcmdui와 UI 상태 설정
}
BOOL CMyClass::OnComplexCommand(UINT nID)
{
?? / / 명령을 처리
?? TRUE를 반환 합니다.
}(&N)
단일 명령 처리기 명령 범위를 처리할 수 있는 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)