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_RANGE
verwendet 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
OnZoom
es .
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
OnButtonClicked
es .
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.