Udostępnij za pośrednictwem


Programy obsługi dla zakresów map komunikatów

W tym artykule wyjaśniono, jak zamapować zakres komunikatów na jedną funkcję obsługi komunikatów (zamiast mapować jeden komunikat na tylko jedną funkcję).

Czasami trzeba przetworzyć więcej niż jeden komunikat lub kontrolować powiadomienie w dokładnie taki sam sposób. W takich momentach możesz zamapować wszystkie komunikaty na jedną funkcję obsługi. Zakresy mapy komunikatów umożliwiają wykonanie tej czynności dla ciągłego zakresu komunikatów:

  • Zakresy identyfikatorów poleceń można mapować na:

    • Funkcja obsługi poleceń.

    • Funkcja obsługi aktualizacji poleceń.

  • Komunikaty powiadomień sterowania można mapować dla zakresu identyfikatorów kontrolek do funkcji obsługi komunikatów.

Tematy omówione w tym artykule obejmują:

Pisanie wpisu mapy komunikatów

W. Plik CPP, dodaj wpis message-map, jak pokazano w poniższym przykładzie:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

Wpis message-map składa się z następujących elementów:

  • Makro zakresu mapy komunikatów:

  • Parametry makra:

    Pierwsze dwa makra przyjmują trzy parametry:

    • Identyfikator polecenia, który uruchamia zakres

    • Identyfikator polecenia kończący zakres

    • Nazwa funkcji obsługi komunikatów

    Zakres identyfikatorów poleceń musi być ciągły.

    Trzecie makro ON_CONTROL_RANGE, przyjmuje dodatkowy pierwszy parametr: komunikat powiadomienia sterowania, taki jak EN_CHANGE.

Deklarowanie funkcji obsługi

Dodaj deklarację funkcji obsługi w pliku . Plik H. Poniższy kod pokazuje, jak może to wyglądać, jak pokazano poniżej:

public:
   afx_msg void OnDoSomething(UINT nID);

Funkcje obsługi dla pojedynczych poleceń zwykle nie przyjmują żadnych parametrów. Z wyjątkiem funkcji obsługi aktualizacji funkcje obsługi dla zakresów mapy komunikatów wymagają dodatkowego parametru, nID, typu UINT. Ten parametr jest pierwszym parametrem. Dodatkowy parametr uwzględnia dodatkowy identyfikator polecenia potrzebny do określenia polecenia, które użytkownik wybrał.

Aby uzyskać więcej informacji na temat wymagań parametrów dotyczących funkcji obsługi aktualizacji, zobacz Przykład dla zakresu identyfikatorów poleceń.

Przykład dla zakresu identyfikatorów poleceń

Jeśli możesz użyć zakresów Jeden przykład jest w obsłudze poleceń, takich jak zoom polecenia w przykładzie MFC HIERSVR. To polecenie powiększa widok, skalując go w zakresie od 25% do 300% normalnego rozmiaru. Klasa widoków HIERSVR używa zakresu do obsługi poleceń Zoom z wpisem mapy komunikatów przypominającym to:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

Podczas pisania wpisu message-map należy określić:

  • Dwa identyfikatory poleceń, rozpoczynające i kończące ciągły zakres.

    Oto ID_VIEW_ZOOM25 i ID_VIEW_ZOOM300.

  • Nazwa funkcji obsługi dla poleceń.

    OnZoomOto .

Deklaracja funkcji będzie wyglądać następująco:

public:
   afx_msg void OnZoom(UINT nID);

Przypadek funkcji obsługi aktualizacji jest podobny i prawdopodobnie będzie bardziej przydatny. Bardzo często można pisać ON_UPDATE_COMMAND_UI programy obsługi dla wielu poleceń i znajdować się na piśmie lub kopiować ten sam kod. Rozwiązaniem jest mapowania różnych identyfikatorów poleceń na jedną funkcję obsługi aktualizacji przy użyciu makra ON_UPDATE_COMMAND_UI_RANGE . Identyfikatory poleceń muszą stanowić ciągły zakres. Aby zapoznać się z przykładem, zobacz procedurę OnUpdateZoom obsługi i jej ON_UPDATE_COMMAND_UI_RANGE wpis message-map w klasie widoku przykładu HIERSVR.

Funkcje obsługi aktualizacji dla pojedynczych poleceń zwykle przyjmują jeden parametr, pCmdUI, typu CCmdUI*. W przeciwieństwie do funkcji obsługi, funkcje obsługi aktualizacji dla zakresów mapy komunikatów nie wymagają dodatkowego parametru, nID, typu UINT. Identyfikator polecenia, który jest potrzebny do określenia polecenia, które użytkownik wybrał, znajduje się w CCmdUI obiekcie.

Przykład dla zakresu identyfikatorów kontrolek

Innym interesującym przypadkiem jest mapowanie komunikatów powiadomień sterowania dla zakresu identyfikatorów kontrolek do pojedynczej procedury obsługi. Załóżmy, że użytkownik może kliknąć dowolny z 10 przycisków. Aby zamapować wszystkie 10 przycisków na jedną procedurę obsługi, wpis message-map wygląda następująco:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

Podczas pisania makra na mapie komunikatów ON_CONTROL_RANGE należy określić:

  • Określony komunikat powiadomienia o kontrolce.

    Oto BN_CLICKED.

  • Wartości identyfikatora kontrolki skojarzone z ciągłym zakresem kontrolek.

    Oto IDC_BUTTON1 i IDC_BUTTON10.

  • Nazwa funkcji obsługi komunikatów.

    OnButtonClickedOto .

Podczas pisania funkcji obsługi określ dodatkowy parametr UINT , jak pokazano poniżej:

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

Procedura OnButtonClicked obsługi pojedynczego komunikatu BN_CLICKED nie przyjmuje żadnych parametrów. Ta sama procedura obsługi dla wielu przycisków wymaga jednego interfejsu użytkownika. Dodatkowy parametr umożliwia identyfikację konkretnej kontrolki odpowiedzialnej za generowanie komunikatu BN_CLICKED .

Kod pokazany w przykładzie jest typowy: konwertowanie wartości przekazanej do int zakresu komunikatów i potwierdzenie, że tak jest. Następnie możesz podjąć inną akcję w zależności od tego, który przycisk został kliknięty.

Zobacz też

Deklarowanie funkcji obsługi komunikatów