Handler für Meldungszuordnungsbereiche

In diesem Artikel wird erläutert, wie Sie einen Nachrichtenbereich einer einzelnen Nachrichtenhandlerfunktion zuordnen (anstatt eine Nachricht nur einer Funktion zuzuordnen).

Es gibt Zeiten, in denen Sie mehrere Nachrichten oder Steuerelementbenachrichtigungen auf genau die gleiche Weise verarbeiten müssen. Zu solchen Zeiten möchten Sie möglicherweise alle Nachrichten einer einzelnen Handlerfunktion zuordnen. Nachrichtenzuordnungsbereiche ermöglichen Ihnen dies für einen zusammenhängenden Nachrichtenbereich:

  • Sie können Befehls-IDs den folgenden Bereichen zuordnen:

    • Eine Befehlshandlerfunktion.

    • Eine Befehlsaktualisierungshandlerfunktion.

  • Sie können Steuerelementbenachrichtigungen für einen Bereich von Steuerelement-IDs einer Nachrichtenhandlerfunktion zuordnen.

In diesem Artikel werden die folgenden Themen behandelt:

Schreiben des Nachrichtenzuordnungseintrags

In der . CPP-Datei, fügen Sie Ihren Nachrichtenzuordnungseintrag hinzu, wie im folgenden Beispiel gezeigt:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

Der Nachrichtenzuordnungseintrag besteht aus den folgenden Elementen:

  • Das Makro "Nachrichtenzuordnungsbereich":

  • Parameter für das Makro:

    Die ersten beiden Makros verwenden drei Parameter:

    • Die Befehls-ID, die den Bereich startet

    • Die Befehls-ID, die den Bereich beendet

    • Der Name der Nachrichtenhandlerfunktion

    Der Bereich der Befehls-IDs muss zusammenhängend sein.

    Das dritte Makro , ON_CONTROL_RANGEverwendet einen zusätzlichen ersten Parameter: eine Steuerelementbenachrichtigungsnachricht, z . B. EN_CHANGE.

Deklarieren der Handler-Funktion

Fügen Sie die Handlerfunktionsdeklaration in der . H-Datei. Der folgende Code zeigt, wie dies aussehen könnte, wie unten dargestellt:

public:
   afx_msg void OnDoSomething(UINT nID);

Handlerfunktionen für einzelne Befehle verwenden normalerweise keine Parameter. Mit Ausnahme von Updatehandlerfunktionen erfordern Handlerfunktionen für Nachrichtenzuordnungsbereiche einen zusätzlichen Parameter vom Typ UINT. Dieser Parameter ist der erste Parameter. Der zusätzliche Parameter enthält die zusätzliche Befehls-ID, die erforderlich ist, um anzugeben, welchen Befehl der Benutzer tatsächlich ausgewählt hat.

Weitere Informationen zu Parameteranforderungen für die Aktualisierung von Handlerfunktionen finden Sie unter Beispiel für einen Bereich von Befehls-IDs.

Beispiel für einen Bereich von Befehls-IDs

Wenn Sie Bereiche verwenden können, ist ein Beispiel für die Behandlung von Befehlen wie dem Befehl "Zoom" im MFC-Beispiel HIERSVR. Dieser Befehl vergrößert die Ansicht und skaliert sie zwischen 25 % und 300 % ihrer normalen Größe. Die Ansichtsklasse von HIERSVR verwendet einen Bereich, um die Zoombefehle mit einem Meldungszuordnungseintrag wie folgt zu behandeln:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

Wenn Sie den Nachrichtenzuordnungseintrag schreiben, geben Sie Folgendes an:

  • Zwei Befehls-IDs, der Anfang und das Beenden eines zusammenhängenden Bereichs.

    Hier sind sie ID_VIEW_ZOOM25 und ID_VIEW_ZOOM300.

  • Der Name der Handlerfunktion für die Befehle.

    Hier ist OnZoomes .

Die Funktionsdeklaration würde wie folgt aussehen:

public:
   afx_msg void OnZoom(UINT nID);

Der Fall von Updatehandlerfunktionen ist ähnlich und wahrscheinlich nützlicher. Es ist ziemlich üblich, Handler für eine Reihe von Befehlen zu schreiben ON_UPDATE_COMMAND_UI und sich selbst zu schreiben oder zu kopieren, denselben Code immer wieder. Die Lösung besteht darin, einen Bereich von Befehls-IDs einer Updatehandlerfunktion mithilfe des ON_UPDATE_COMMAND_UI_RANGE Makros zuzuordnen. Die Befehls-IDs müssen einen zusammenhängenden Bereich bilden. Ein Beispiel finden Sie im OnUpdateZoom Handler und dem zugehörigen ON_UPDATE_COMMAND_UI_RANGE Meldungszuordnungseintrag in der Ansichtsklasse HIERSVR.

Aktualisieren Von Handlerfunktionen für einzelne Befehle wird normalerweise ein einzelner Parameter ( pCmdUI) vom Typ CCmdUI*verwendet. Im Gegensatz zu Handlerfunktionen benötigen Updatehandlerfunktionen für Nachrichtenzuordnungsbereiche keinen zusätzlichen Parameter vom Typ UINT. Die Befehls-ID, die erforderlich ist, um anzugeben, welchen Befehl der Benutzer tatsächlich ausgewählt hat, befindet sich im CCmdUI Objekt.

Beispiel für einen Bereich von Steuerelement-IDs

Ein weiterer interessanter Fall ist das Zuordnen von Steuerelementbenachrichtigungsmeldungen für einen Bereich von Steuerelement-IDs zu einem einzelnen Handler. Angenommen, der Benutzer kann auf eine beliebige von 10 Schaltflächen klicken. Um alle 10 Schaltflächen einem Handler zuzuordnen, würde ihr Nachrichtenzuordnungseintrag wie folgt aussehen:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

Wenn Sie das Makro in Ihrer ON_CONTROL_RANGE Nachrichtenzuordnung schreiben, geben Sie Folgendes an:

  • Eine bestimmte Steuerelementbenachrichtigung.

    Hier ist es BN_CLICKED.

  • Die Steuerelement-ID-Werte, die dem zusammenhängenden Bereich von Steuerelementen zugeordnet sind.

    Hier sind dies IDC_BUTTON1 und IDC_BUTTON10.

  • Der Name der Nachrichtenhandlerfunktion.

    Hier ist OnButtonClickedes .

Geben Sie beim Schreiben der Handlerfunktion den zusätzlichen UINT-Parameter an, wie in den folgenden Beispielen gezeigt:

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

Der OnButtonClicked Handler für eine einzelne BN_CLICKED Nachricht akzeptiert keine Parameter. Derselbe Handler für einen Bereich von Schaltflächen verwendet einen UINT. Der zusätzliche Parameter ermöglicht die Identifizierung des bestimmten Steuerelements, das für die Generierung der BN_CLICKED Nachricht verantwortlich ist.

Der im Beispiel gezeigte Code ist typisch: Konvertieren des werts, der in einen int innerhalb des Nachrichtenbereichs übergeben wird, und bestätigen, dass dies der Fall ist. Dann können Sie je nachdem, auf welche Schaltfläche geklickt wurde, eine andere Aktion ausführen.

Siehe auch

Deklarieren von Meldungshandlerfunktionen