다음을 통해 공유


메시지 맵 범위에 대한 처리기

이 문서에서는 하나의 메시지를 하나의 함수에만 매핑하는 대신 메시지 범위를 단일 메시지 처리기 함수에 매핑하는 방법을 설명합니다.

동일한 방식으로 둘 이상의 메시지 또는 제어 알림을 처리해야 하는 경우가 있습니다. 이러한 경우 모든 메시지를 단일 처리기 함수에 매핑할 수 있습니다. 메시지 맵 범위를 사용하면 연속된 메시지 범위에 대해 이 작업을 수행할 수 있습니다.

  • 명령 ID의 범위를 다음으로 매핑할 수 있습니다.

    • 명령 처리기 함수입니다.

    • 명령 업데이트 처리기 함수입니다.

  • 컨트롤 ID 범위에 대한 컨트롤 알림 메시지를 메시지 처리기 함수에 매핑할 수 있습니다.

이 문서에서 다루는 항목은 다음과 같습니다.

메시지 맵 항목 작성

안에. CPP 파일은 다음 예제와 같이 메시지 맵 항목을 추가합니다.

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

메시지 맵 항목은 다음 항목으로 구성됩니다.

  • 메시지 맵 범위 매크로:

  • 매크로에 대한 매개 변수:

    처음 두 매크로는 세 개의 매개 변수를 사용합니다.

    • 범위를 시작하는 명령 ID입니다.

    • 범위를 종료하는 명령 ID입니다.

    • 메시지 처리기 함수의 이름

    명령 ID의 범위는 연속적이어야 합니다.

    세 번째 매크로ON_CONTROL_RANGE는 첫 번째 매개 변수인 EN_CHANGE 같은 컨트롤 알림 메시지를 추가합니다.

처리기 함수 선언

에 처리기 함수 선언을 추가합니다. H 파일입니다. 다음 코드는 아래와 같이 이 모양이 어떻게 표시되는지 보여줍니다.

public:
   afx_msg void OnDoSomething(UINT nID);

단일 명령에 대한 처리기 함수는 일반적으로 매개 변수를 사용하지 않습니다. 업데이트 처리기 함수를 제외하고 메시지 맵 범위에 대한 처리기 함수에는 UINT 형식의 추가 매개 변수 nID가 필요합니다. 이 매개 변수는 첫 번째 매개 변수입니다. 추가 매개 변수는 사용자가 실제로 선택한 명령을 지정하는 데 필요한 추가 명령 ID를 수용합니다.

처리기 함수를 업데이트하기 위한 매개 변수 요구 사항에 대한 자세한 내용은 명령 ID 범위에 대한 예제를 참조 하세요.

명령 ID 범위의 예

범위를 사용할 수 있는 경우 한 가지 예는 MFC 샘플 HIERSVR의 Zoom 명령과 같은 명령을 처리하는 것입니다. 이 명령은 보기를 확대/축소하여 일반 크기의 25%에서 300% 사이로 확장합니다. HIERSVR의 뷰 클래스는 범위를 사용하여 다음과 유사한 메시지 맵 항목으로 Zoom 명령을 처리합니다.

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

메시지 맵 항목을 작성할 때 다음을 지정합니다.

  • 연속 범위를 시작하고 종료하는 두 개의 명령 ID입니다.

    여기에 그들은 ID_VIEW_ZOOM25 ID_VIEW_ZOOM300.

  • 명령에 대한 처리기 함수의 이름입니다.

    여기 있습니다 OnZoom.

함수 선언은 다음과 유사합니다.

public:
   afx_msg void OnZoom(UINT nID);

업데이트 처리기 함수의 경우는 비슷하며 더 널리 유용할 수 있습니다. 여러 명령에 대한 처리기를 작성하고 ON_UPDATE_COMMAND_UI 동일한 코드를 반복해서 쓰거나 복사하는 것이 일반적입니다. 해결 방법은 매크로를 사용하여 명령 ID 범위를 하나의 업데이트 처리기 함수에 매핑하는 것입니다 ON_UPDATE_COMMAND_UI_RANGE . 명령 ID는 연속 범위를 형성해야 합니다. 예를 들어 HIERSVR 샘플의 OnUpdateZoom 뷰 클래스에서 처리기 및 메시지 ON_UPDATE_COMMAND_UI_RANGE 맵 항목을 참조하세요.

단일 명령에 대한 업데이트 처리기 함수는 일반적으로 형식CCmdUI*의 단일 매개 변수인 pCmdUI를 사용합니다. 처리기 함수와 달리 메시지 맵 범위에 대한 업데이트 처리기 함수에는 UINT 형식의 추가 매개 변수 nID가 필요하지 않습니다. 사용자가 실제로 선택한 명령을 지정하는 데 필요한 명령 ID가 개체에 CCmdUI 있습니다.

컨트롤 ID 범위의 예

또 다른 흥미로운 사례는 컨트롤 ID 범위에 대한 컨트롤 알림 메시지를 단일 처리기에 매핑하는 것입니다. 사용자가 10개 단추 중 어느 것을 클릭할 수 있다고 가정합니다. 10개의 단추를 모두 하나의 처리기에 매핑하기 위해 메시지 맵 항목은 다음과 같습니다.

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

메시지 맵에 매크로를 ON_CONTROL_RANGE 작성할 때 다음을 지정합니다.

  • 특정 컨트롤 알림 메시지입니다.

    여기에 BN_CLICKED.

  • 연속된 컨트롤 범위와 연결된 컨트롤 ID 값입니다.

    다음은 IDC_BUTTON1IDC_BUTTON10.

  • 메시지 처리기 함수의 이름입니다.

    여기 있습니다 OnButtonClicked.

처리기 함수를 작성할 때 다음과 같이 추가 UINT 매개 변수를 지정합니다.

void CRangesView::OnButtonClicked(UINT nID)
{
   int nButton = nID - IDC_BUTTON1;
   ASSERT(nButton >= 0 && nButton < 10);
   // ...
}

OnButtonClicked 단일 BN_CLICKED 메시지에 대한 처리기는 매개 변수를 사용하지 않습니다. 단추 범위에 대한 동일한 처리기는 하나의 UINT를 사용합니다. 추가 매개 변수를 사용하면 BN_CLICKED 메시지 생성을 담당하는 특정 컨트롤을 식별할 있습니다.

예제에 표시된 코드는 일반적으로 메시지 범위 내에서 전달된 int 값을 변환하고 이 경우를 어설션합니다. 그런 다음 클릭한 단추에 따라 다른 작업을 수행할 수 있습니다.

참고 항목

메시지 처리기 함수 선언