TN061: ON_NOTIFY- und WM_NOTIFY-Meldungen

HinweisHinweis

Im Folgenden technischen Hinweis ist nicht aktualisiert wurde, seitdem er erstmals in der Onlinedokumentation enthalten waren.Folglich können mehrere Prozeduren und Themen veraltet oder falsch.Die aktuellsten Informationen wird empfohlen, zum Thema Onlinedokumentations im Index finden.

In diesem technischen Hinweis enthält Hintergrundinformationen auf der neuen WM_NOTIFY Meldung bereit und beschreibt die empfohlene (und die meisten Allgemein) - Methode des Behandlung von WM_NOTIFY Meldungen in der MFC-Anwendung.

Benachrichtigungsmeldungen in Windows 3.x

In Windows 3.x, melden Steuerelemente ihre übergeordneten Elemente von Ereignissen, z. B. Mausklicks Änderungen im Inhalt und Auswahl und Hintergrund des Steuerelements zeichnen, indem sie eine Meldung im übergeordneten Element übertragen.Einfache Benachrichtigungen werden als spezielle WM_COMMAND Meldungen, mit dem Benachrichtigungscode (z. B. BN_CLICKED) und der Steuerelement-ID, die in wParam gepackt werden und dem Handle des Steuerelements in lParam gesendet.Beachten Sie, dass seit wParam und lParam voll sind, gibt es keine Möglichkeit, sind zusätzliche Daten zu übermitteln:Diese Meldungen können nur einfache Benachrichtigung sein.In der BN_CLICKED Benachrichtigung, gibt es keine Möglichkeit, Informationen über die Position des Mauszeigers zu senden, als auf die Schaltfläche geklickt wurde.

Wenn Steuerelemente in Windows 3.x eine Benachrichtigung senden müssen, die zusätzliche Daten enthält, verwenden sie eine Vielzahl von Meldungen für spezielle Zwecke, z. B. WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM usw.Diese Meldungen können dem Steuerelement angegeben werden, der sie gesendet hat.Weitere Informationen finden Sie unter TN062: Meldungs-Reflektion für Windows-Steuerelemente.

Benachrichtigungsmeldungen in Win32

Für Steuerelemente, die in Windows 3.1 vorhanden waren, wird die Win32-API die meisten Benachrichtigungsmeldungen, die in Windows 3.x verwendet. wurden.Win32 fügt jedoch auch einige ausgereiftes, mit denen komplexe Steuerelemente hinzu, die in Windows 3.x. unterstützt werden.Häufig Anforderung dieser Steuerelemente zusätzliche Daten mit ihren Benachrichtigungsmeldungen zu senden.Anstatt eine neue WM_* Meldung für jede neue Benachrichtigung hinzufügen, die zusätzliche Daten benötigt beschlossen, die Designer der Win32-API, um nur eine Nachricht, WM_NOTIFY hinzuzufügen, die eine Menge zusätzlicher Daten in einer standardisierten Weise bereitstellen kann.

WM_NOTIFY Meldungen enthalten die ID des Steuerelements, das die Nachricht in wParam und einen Zeiger auf eine Struktur in lParam sendet.Diese Struktur ist entweder eine NMHDR-Struktur oder eine größere Struktur, die eine NMHDR-Struktur als erster Member.Beachten Sie, wie der NMHDR-Member der ersten ist ein Zeiger auf dieser Struktur kann entweder als Zeiger auf NMHDR oder als größeren Zeiger auf eine Struktur je nachdem, wie sie umwandeln.

In den meisten Fällen zeigt der Zeiger auf einer größeren Struktur und Sie müssen sie umwandeln, wenn Sie sie verwenden.In z. B. Benachrichtigungen nur einige häufig auftretende Benachrichtigungen der Benachrichtigungen (deren Namen mit NM_ beginnen) und TTN_SHOW und TTN_POP eines QuickInfo-Steuerelements tatsächlich verwendete ist eine NMHDR-Struktur.

Die NMHDR-Struktur oder das Gründungsmitglied enthält das Handle und die ID des Steuerelements mit der angegebenen Meldung und dem Benachrichtigungscode (z. B. TTN_SHOW) sendet.Das Format der NMHDR-Struktur wird im Folgenden gezeigt:

typedef struct tagNMHDR {
    HWND hwndFrom;
    UINT idFrom;
    UINT code;
} NMHDR;

Für eine TTN_SHOW Meldung würde der Codemember zu TTN_SHOW festgelegt.

Die meisten Benachrichtigungen führen einen Zeiger auf eine Struktur, die eine größere NMHDR-Struktur als erster Member enthält.Betrachten Sie beispielsweise die Struktur als LVN_KEYDOWN Verwendung durch die Benachrichtigungsmeldung Listenansicht-Steuerelement, die gesendet wird, wenn der Schlüssel ein Listenansicht-Steuerelement gedrückt wird.Der Zeiger zeigt auf eine Struktur, die LV_KEYDOWN wie unten dargestellt definiert ist:

typedef struct tagLV_KEYDOWN {
    NMHDR hdr;   
    WORD wVKey;  
    UINT flags;  
} LV_KEYDOWN;

Beachten Sie, wie der NMHDR ersten Member in dieser Struktur ist, die Zeiger, den Sie in die Benachrichtigungsmeldung können einem Zeiger auf NMHDR oder ein Zeiger auf LV_KEYDOWN umgewandelt werden bestanden wurden.

Benachrichtigungen häufig auf alle neuen Windows-Steuerelementen

Einige Benachrichtigungen sind für alle neuen Windows-Steuerelementen.Diese Benachrichtigungen führen einen Zeiger auf eine NMHDR-Struktur.

Benachrichtigungscode

Gesendet da

NM_CLICK

Benutzer klicken auf linke Maustaste im Steuerelement

NM_DBLCLK

Benutzer auf die linke Maustaste im Steuerelement doppelklicken

NM_RCLICK

Benutzer klicken auf rechten Maustaste im Steuerelement

NM_RDBLCLK

Benutzer mit der rechten Maustaste im Steuerelement doppelklicken

NM_RETURN

Benutzer die EINGABETASTE gedrückt, während Steuerelement den Eingabefokus besitzt

NM_SETFOCUS

Steuerelement ist angegebener Eingabefokus wurden

NM_KILLFOCUS

Steuerelement den Eingabefokus besitzt verloren

NM_OUTOFMEMORY

Steuerelement könnte einen Vorgang nicht ausführen, da nicht genügend Arbeitsspeicher verfügbar ist

ON_NOTIFY: Behandlungs-WM NOTIFY der Nachrichten in MFC-Anwendungen

Die Funktion CWnd::OnNotify Handle benachrichtigungsmeldungen.Die Standardimplementierung überprüft die Meldungszuordnung, sodass Benachrichtigung Klassenhandler aufrufen.Im Allgemeinen nicht überschrieben OnNotify.Erstellen Sie stattdessen eine Handlerfunktion und fügen einen Meldungszuordnungseintrag für diesen Handler der Meldungszuordnung der Klasse des Besitzerfensters hinzu.

ClassWizard, über das ClassWizard-Eigenschaftenblatt, kann den ON_NOTIFY Meldungszuordnungseintrag erstellen und mit einem Skelett handlerfunktion bereitgestellt.Weitere Informationen zur Verwendung von ClassWizard, damit dieser einfacher zu machen, finden Sie unter Zuordnungs-Meldungen Funktionen.

Das ON_NOTIFY Meldungszuordnungs Makro hat folgende Syntax:

ON_NOTIFY( wNotifyCode, id, memberFxn )

gedruckten kursiv wo die durch Parameter ersetzt werden:

  • wNotifyCode
    Der Code für die Benachrichtigungsmeldung, wie LVN_KEYDOWN behandelt werden kann.

  • id
    Der untergeordnete Bezeichner des Steuerelements, für den die Benachrichtigung gesendet wird.

  • memberFxn
    Die Memberfunktion aufgerufen werden soll, wenn diese Benachrichtigung gesendet wird.

Die Memberfunktion muss mit folgendem Prototyp deklariert werden:

afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );

Hinweise

wo die kursiv gedruckten Parameter sind:

  • pNotifyStruct
    Ein Zeiger auf die Benachrichtigung Struktur, wie im Abschnitt oben beschrieben.

  • result
    Ein Zeiger auf den Ergebniscode, den Sie festlegen, bevor Sie zurückkehren.

Beispiel

Um anzugeben, dass Sie die Memberfunktion OnKeydownList1LVN_KEYDOWN von Meldungen verarbeiten soll CListCtrl der ID IDC_LIST1 ist, würden Sie Folgendes verwenden ClassWizard der Meldungszuordnung hinzuzufügen:

ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )

Im obigen Beispiel ist die Funktion, die von ClassWizard bereitgestellt wird:

void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
   LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
   // TODO: Add your control notification handler
   //       code here
   
   *pResult = 0;
}

Beachten Sie, dass ClassWizard einen Zeiger des richtigen Typs automatisch bereitstellt.Sie können die Benachrichtigung über pNMHDR-Struktur oder pLVKeyDow zugreifen.

ON_NOTIFY_RANGE

Wenn Sie dieselbe WM_NOTIFY Meldung für eine Gruppe von Steuerelementen verarbeitet werden müssen, können Sie statt ON_NOTIFY_RANGEON_NOTIFY verwenden.Beispielsweise verfügen Sie möglicherweise eine Gruppe von Schaltflächen, für die Sie die gleiche Aktion für eine bestimmte Benachrichtigungsmeldung ausführen möchten.

Wenn Sie ON_NOTIFY_RANGE verwenden, geben Sie einen zusammenhängenden Bereich von untergeordneten Bezeichner an, dass die bearbeiten die Benachrichtigungsmeldung durch Angabe der untergeordneten Bezeichner des Anfangs und des Endes des Bereichs.

ClassWizard nicht behandeltes ON_NOTIFY_RANGE. Um diese Funktion zu verwenden, müssen Sie die Meldungszuordnung bearbeiten.

Der Meldungszuordnungseintrag und der Funktionsprototyp für ON_NOTIFY_RANGE lauten wie folgt:

ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )

gedruckten kursiv wo die durch Parameter ersetzt werden:

  • wNotifyCode
    Der Code für die Benachrichtigungsmeldung, wie LVN_KEYDOWN behandelt werden kann.

  • id
    Der erste Bezeichner in zusammenhängenden Bereich von Bezeichnern.

  • idLast
    Der letzte Bezeichner in zusammenhängenden Bereich von Bezeichnern.

  • memberFxn
    Die Memberfunktion aufgerufen werden soll, wenn diese Benachrichtigung gesendet wird.

Die Memberfunktion muss mit folgendem Prototyp deklariert werden:

afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );

Hinweise

wo die kursiv gedruckten Parameter sind:

  • id
    Der untergeordnete Bezeichner des Steuerelements, das die eine Benachrichtigung gesendet hat.

  • pNotifyStruct
    Ein Zeiger auf die Benachrichtigung Struktur, wie oben beschrieben.

  • result
    Ein Zeiger auf den Ergebniscode, den Sie festlegen, bevor Sie zurückkehren.

ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE

Wenn Sie mehr als ein Objekt im Benachrichtigung routing eine Nachricht verarbeiten soll, können Sie ON_NOTIFY_EX (oder ON_NOTIFY_EX_RANGE) statt ON_NOTIFY (oder ON_NOTIFY_RANGE) verwenden.Der einzige Unterschied zwischen der EX-Version und der regulären Version besteht darin, dass die Memberfunktion, die für die EX-Version aufgerufen wird, BOOL zurückgibt, die angibt, ob der Nachrichtenverarbeitung fortgesetzt werden soll.Die Rückgabe von FALSE von dieser Funktion können Sie die gleiche Nachricht in mehr als einem Objekt zu verarbeiten.

ClassWizard nicht behandelt ON_NOTIFY_EX oder ON_NOTIFY_EX_RANGE. Wenn Sie einen davon verwenden möchten, müssen Sie die Meldungszuordnung bearbeiten.

Der Meldungszuordnungseintrag und der Funktionsprototyp für ON_NOTIFY_EX und ON_NOTIFY_EX_RANGE sind wie folgt:Die Bedeutungen der Parameter sind dieselben wie für Nicht-EX-Versionen.

ON_NOTIFY_EX( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )

Der Prototyp für beide vom oben erwähnten unterscheidet:

afx_msg BOOL memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );

Hinweise

In beiden Fällen hält id untergeordneten Bezeichner des Steuerelements an die eine Benachrichtigung gesendet hat.

Die Funktion muss TRUE zurückgeben, wenn die Benachrichtigungsmeldung FALSE oder vollständig verarbeitet wurde, wenn andere Objekte im Befehl routing eine Möglichkeit haben, die Nachricht zu bearbeiten.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie