TN061: ON_NOTIFY- und WM_NOTIFY-Nachrichten

Diese technische Hinweis enthält Hintergrundinformationen über die neue WM_NOTIFY -Meldung und beschreibt die empfohlene (und häufigsten) Behandlung WM_NOTIFY -Meldungen in der MFC-Anwendung.

Benachrichtigungen in Windows 3.x

In Windows 3.x Steuerelemente Benachrichtigen Sie ihren Eltern Ereignisse, z. B. Mausklicks, Änderungen im Inhalt und Auswahl im Steuerelement Hintergrund Malerei durch Senden einer Nachricht an das übergeordnete Element. Einfache Benachrichtigungen werden als spezielle WM_COMMAND -Nachrichten, mit der Benachrichtigungscode (z. B. BN_CLICKED) gesendet und Steuern ID wParam und das Handle des Steuerelements in lParamgepackt. Beachten Sie, dass da wParam und lParam voll sind, es keine Möglichkeit gibt, zusätzlichen Daten zu übergeben – diese Meldungen können nur einfache Mitteilung sein. Zum Beispiel in die BN_CLICKED -Benachrichtigung gibt es keine Möglichkeit zum Senden von Informationen über die Position des Mauszeigers, wenn die Schaltfläche geklickt wurde.

Wenn Steuerelemente in Windows 3.x müssen eine Benachrichtigung zu senden, die zusätzliche Daten enthält, sie verwenden eine Vielzahl von Spezial Nachrichten, einschließlich WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM, und so weiter. Diese Nachrichten können wieder an das Steuerelement wiedergegeben, die sie gesendet. Weitere Informationen finden Sie unter TN062: Message Reflection für Windows-Steuerelemente.

Benachrichtigungen in Win32

Für Steuerelemente, die in Windows 3.1 existierte, verwendet die Win32-API meist die Benachrichtigungsmeldungen, die in Windows 3.x verwendet wurden. Win32, die häufig in Windows 3.x. unterstützt auch eine Reihe von anspruchsvollen und komplexen Steuerelementen hinzufügt, müssen jedoch diese Steuerelemente zusätzliche Daten mit ihrer Benachrichtigungen senden. Anstatt das Hinzufügen einer neuen WM_ * Meldung für jede neue Benachrichtigung, die zusätzliche Daten benötigt, entschied sich die Designer von der Win32-API nur eine Nachricht WM_NOTIFY, hinzufügen, die jede Menge zusätzliche Daten in einer standardisierten Art und Weise weitergeben können.

WM_NOTIFY -Nachrichten enthalten die ID des Steuerelements Senden der Nachricht im wParam-Parameter und einen Zeiger auf eine Struktur im lParam. Diese Struktur ist entweder eine NMHDR -Struktur oder einige größere Struktur, die eine NMHDR -Struktur als erste Member hat. Beachten Sie, dass seit der NMHDR -Mitglied erste, einen Zeiger auf diese Struktur kann verwendet werden, als entweder einen Zeiger auf eine NMHDR oder als ein Zeiger auf die größere Struktur je nachdem, wie Sie es umwandeln.

In den meisten Fällen der Zeiger wird zu einer größeren Struktur zeigen und du musst es umwandeln, wenn Sie es verwenden. In nur ein paar Benachrichtigungen, wie z. B. die gemeinsamen Benachrichtigungen (deren Namen beginnen mit NM_) und des QuickInfo-Steuerelements des TTN_SHOW und TTN_POP -Benachrichtigungen, ist eine NMHDR -Struktur tatsächlich verwendeten.

Die NMHDR -Struktur oder ersten Member enthält den Griff und die ID des Steuerelements senden die Nachricht und der Benachrichtigungscode (z. B. TTN_SHOW). Das Format der NMHDR -Struktur ist unten dargestellt.:

typedef Struct Tag&NMHDR {}
 Nbsp;  HWND HwndFrom;
    UINT IdFrom;
    UINT-Code;
} NMHDR

Für eine TTN_SHOW Nachricht würde das Code -Element auf TTN_SHOW gesetzt werden.

Die meisten Mitteilungen übergeben Sie einen Zeiger auf eine größere Struktur, die eine NMHDR -Struktur als erste Member enthält. Betrachten Sie beispielsweise die Ansicht Listensteuerelement LVN_KEYDOWN Benachrichtigung, die gesendet wird, wenn eine Taste, in einem Listenansicht-Steuerelement gedrückt wird verwendete Struktur. Der Zeiger verweist auf eine LV_KEYDOWN -Struktur, die wie folgt definiert ist:

typedef Struct TagLV_KEYDOW&N {}
 Nbsp;  NMHDR Hdr;   
    WORD wVKey;  
    UINT Flags;  
} LV_KEYDOWN

Beachten Sie, dass seit der NMHDR -Member zuerst in dieser Struktur ist, der Zeiger, die, den Sie in der Benachrichtigung übergeben sind, entweder einen Zeiger auf eine NMHDR oder ein Zeiger auf eine LV_KEYDOWN umgewandelt werden kann.

Benachrichtigungen, die alle neuen Windows-Steuerelementen gemeinsam

Einige Benachrichtigungen sind in allen neuen Windows-Steuerelemente. Diese Benachrichtigungen übergeben Sie einen Zeiger auf eine NMHDR -Struktur.

Avisierungscode Gesendet, da
NM_CLICK Benutzer auf linke Maustaste Schaltfläche im Steuerelement geklickt
NM_DBLCLK Benutzer doppelgeklickt linken Maustaste in das Steuerelement
NM_RCLICK Benutzer rechten Maustaste Schaltfläche im Steuerelement geklickt
NM_RDBLCLK Benutzer doppelgeklickt rechten Maustaste in das Steuerelement
NM_RETURN Benutzer die ENTER-Taste gedrückt, während das Steuerelement den Eingabefokus besitzt
NM_SETFOCUS Steuerelement hat den Eingabefokus erhalten
NM_KILLFOCUS Eingabefokus hat die Kontrolle verloren
NM_OUTOFMEMORY Steuerelement konnte einen Vorgang nicht abschließen, weil es nicht genügend Arbeitsspeicher verfügbar war

ON_NOTIFY: Behandlung von WM_NOTIFY-Meldungen in MFC-Anwendungen

Die Funktion CWnd::OnNotify verarbeitet Benachrichtigungen. Die Standardimplementierung überprüft die Meldungszuordnung für Benachrichtigung Handler aufrufen. In der Regel Sie OnNotifynicht überschreiben. Stattdessen stellen Sie eine Handlerfunktion und die Meldungszuordnung von Ihrem Besitzer Window-Klasse einen Meldungszuordnung Eintrag für diesen Handler hinzuzufügen.

ClassWizard, entweder über das Eigenschaftenblatt ClassWizard oder die Assistentenleiste kann den ON_NOTIFY Meldungszuordnung Eintrag erstellen und Ihnen mit einer Skelett-Handler-Funktion. Weitere Informationen zur Verwendung der Klassen-Assistent um dies zu erleichtern, finden Sie unter Zuordnen von Meldungen zu Funktionen in der Visual C++ Programmer's Guide.

Das Makro ON_NOTIFY Meldungszuordnung hat die folgende syntax:

ON_NOTIFY ( wNotifyCode, Id, MemberFxn )

wobei die kursiv formatierten parameter durch ersetzt werden:

wNotifyCode

Der Code für die Benachrichtigung verarbeitet werden, z. B. LVN_KEYDOWN.

id

Der Kind-Bezeichner des Steuerelements, für die die Benachrichtigung gesendet wird.

memberFxn

Die Memberfunktion aufgerufen werden, wenn diese Benachrichtigung gesendet wird.

Ihre Member-Funktion muss mit den folgenden Prototyp deklariert werden:

afx_msgprivatevoidmemberFxn()NMHDR*pNotifyStruct,LRESULT*Ergebnis);

wo sind die kursiv-parameter:

pNotifyStruct

Ein Zeiger auf die Benachrichtigung Struktur, wie im obigen Abschnitt beschrieben.

ergebnis

Ein Zeiger auf den Ergebniscode werde Sie festlegen, bevor Sie zurück.

Beispiel

Zu geben, dass Sie die Memberfunktion OnKeydownList1 LVN_KEYDOWN Nachrichten von der CListCtrl behandeln mit der ID IDC_LIST1 , verwenden Sie Klassen-Assistent der Meldungszuordnung Folgendes hinzu:

ON_NOTIFY (LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)

Im obigen Beispiel ist die Funktion bereitgestellt durch Klassen-Assistent:

void CMessageReflectionDlg::OnKeydownList1 (&NMHDR * pNMHDR, LRESULT * pResult)
{
   LV_KEYDOWN * pLVKeyDow = (LV_KEYDOWN **) pNMHDR;
   / / TODO: Fügen Sie Ihrem Steuerelement Benachrichtigungshandlers
   / / Nbsp;  Code hier
   
   * pResult = 0;
}

Beachten Sie, dass Klassen-Assistent automatisch einen Zeiger des korrekten Typs bereitstellt. Sie können die Benachrichtigung Struktur zugreifen, entweder durch pNMHDR oderpLVKeyDow.

ON_NOTIFY_RANGE

Wenn Sie die gleiche WM_NOTIFY -Meldung für einen Satz von Steuerelementen verarbeiten müssen, können Sie ON_NOTIFY_RANGE anstatt ON_NOTIFY. Beispielsweise müssen Sie eine Reihe von Schaltflächen für die Sie die gleiche Aktion für eine bestimmte Benachrichtigung durchführen möchten.

Wenn Sie ON_NOTIFY_RANGEverwenden, geben Sie einen zusammenhängenden Bereich von untergeordneten Bezeichner, um die Benachrichtigung zu verarbeiten, indem Sie Anfang und Ende Kind-IDs des Bereichs.

Klassen-Assistent behandelt nicht ON_NOTIFY_RANGE; um es zu verwenden, müssen Sie der Meldungszuordnung selbst bearbeiten.

Die Meldungszuordnung Eintrag und Funktionsprototyp für ON_NOTIFY_RANGE sind wie folgt:

ON_NOTIFY_RANGE ( wNotifyCode, Id, IdLast, MemberFxn )

wobei die kursiv formatierten parameter durch ersetzt werden:

wNotifyCode

Der Code für die Benachrichtigung verarbeitet werden, z. B. LVN_KEYDOWN.

id

Der erste Bezeichner in der zusammenhängenden Bereich von Bezeichnern.

idLast

Die letzten Bezeichner in der zusammenhängenden Bereich von Bezeichnern.

memberFxn

Die Memberfunktion aufgerufen werden, wenn diese Benachrichtigung gesendet wird.

Ihre Member-Funktion muss mit den folgenden Prototyp deklariert werden:

afx_msgprivatevoidmemberFxn()UINT IdNMHDR*pNotifyStruct,LRESULT*Ergebnis);

wo sind die kursiv-parameter:

id

Die Kind-Bezeichner des Steuerelements, die die Benachrichtigung gesendet.

pNotifyStruct

Ein Zeiger auf die Benachrichtigung Struktur, wie oben beschrieben.

ergebnis

Ein Zeiger auf den Ergebniscode werde Sie festlegen, bevor Sie zurück.

ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE

Wenn Sie mehr als ein Objekt in der Benachrichtigung routing eine Nachricht verarbeiten möchten, können Sie anstatt ON_NOTIFY (oder ON_NOTIFY_RANGE) ON_NOTIFY_EX (oder ON_NOTIFY_EX_RANGE). Der einzige Unterschied zwischen der EX -Version und die normale Version ist, dass die Memberfunktion aufgerufen, für die EX -Version einen BOOL , der angibt zurückgibt, ob die Meldung fortgesetzt werden soll oder nicht. Falsche Rückgabe von dieser Funktion können Sie die gleiche Nachricht in mehrere Objekte verarbeiten.

Klassen-Assistent behandelt nicht ON_NOTIFY_EX oder ON_NOTIFY_EX_RANGE; Wenn Sie eine von ihnen verwenden möchten, müssen Sie der Meldungszuordnung selbst bearbeiten.

Die Meldungszuordnung Eintrag und Funktionsprototyp für ON_NOTIFY_EX und ON_NOTIFY_EX_RANGE sind wie folgt. Die Bedeutung der Parameter sind die gleichen wie für die nicht-EX- Versionen.

ON_NOTIFY_EX ( nCode, Id, MemberFxn )

ON_NOTIFY_EX_RANGE ( wNotifyCode, Id, IdLast,MemberFxn )

Der Prototyp für beide der oben genannten ist das gleiche:

afx_msgBOOLmemberFxn()UINT IdNMHDR*pNotifyStruct,LRESULT*Ergebnis);

In beiden Fällen enthält die Id den untergeordneten Bezeichner für das Steuerelement, das die Benachrichtigung gesendet.

Ihre Funktion muss TRUE zurück, wenn die Nachricht vollständig behandelt wurde oder FALSE , wenn andere in die Befehlsrouting Objekte eine Chance haben, um die Nachricht zu verarbeiten.

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index