TN061: ON_NOTIFY- und WM_NOTIFY-Meldungen
Hinweis
Der folgende technische Hinweis wurde seit dem ersten Erscheinen in der Onlinedokumentation nicht aktualisiert.Daher können einige Verfahren und Themen veraltet oder falsch sein.Um aktuelle Informationen zu erhalten, wird empfohlen, das gewünschte Thema im Index der Onlinedokumentation zu suchen.
Dieser technische Hinweis enthält Hintergrundinformationen auf der neuen WM_NOTIFY Meldung an und beschreibt die empfohlene (und verbreitetste) Methode des WM_NOTIFY Behandlung von Meldungen in der MFC-Anwendung.
Benachrichtigungsmeldungen in Windows 3.x
In Windows 3.x, benachrichtigen Steuerelemente ihre übergeordneten Elemente von Ereignissen wie Mausklicks, Änderungen im Inhalt und Auswahl und Steuerhintergrundzeichnen, indem eine Meldung zum übergeordneten senden. Einfache Benachrichtigungen werden als besondere WM_COMMAND Nachrichten gesendet, mit dem Benachrichtigungscode (wie BN_CLICKED) und Steuerelement-ID gepackt in wParam und das Handle des Steuerelements in lParam. Beachten Sie seit das wParam und lParam sind voll, gibt es keine Möglichkeit, 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, sobald 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 Reihe von Meldungen für besondere Zwecke, einschließlich WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM, z. B. Diese Meldungen können an das Steuerelement auswirken, das sie gesendet. Weitere Informationen finden Sie unter TN062: Meldungs-Reflektion für Windows-Steuerelemente.
Benachrichtigungsmeldungen in Win32
Für Steuerelemente, die in Windows 3.1, waren die Win32 API-Gebräuche höchst von den Benachrichtigungsmeldungen, die in Windows 3.x. verwendet wurden. Es fügt Win32 auch einige hoch entwickeltes komplexe Steuerelemente, zu denen hinzu, die in Windows 3.x. unterstützt werden. Häufig Anforderung dieser Steuerelemente, zusätzliche Daten mit ihren Benachrichtigungen senden. Anstatt, eine neue WM_* Meldung für jede Benachrichtigung neue hinzufügen, die weitere Daten benötigt, z die Designer der Win32-API, um nur eine Nachricht, WM_NOTIFY hinzuzufügen, die eine Menge zusätzliche Daten in einer standardisierten Weise übergeben kann.
WM_NOTIFY Meldungen enthalten die ID des Steuerelements, das die Meldung im wParam und einen Zeiger auf eine Struktur in lParam sendet. Diese Struktur ist entweder NMHDR eine Struktur oder eine größere Struktur, die eine NMHDR-Struktur als erster Member verfügt. Beachten Sie, wie der Member, zuerst NMHDR ist ein Zeiger auf diese Struktur kann verwendet werden als Zeiger auf NMHDR oder als Zeiger zur größeren Struktur je nachdem, wie Sie sie umwandeln.
In den meisten Fällen wird der Zeiger auf einer größeren Struktur und Sie müssen es umwandeln, wenn Sie sie verwenden. In einigen nur Benachrichtigungen wie den allgemeinen Benachrichtigungen der Benachrichtigungen (deren Namen mit NM_ beginnen) und TTN_SHOWTTN_POP des ToolTip-Steuerelements, ist eine wirklich verwendete NMHDR-Struktur.
Die NMHDR-Struktur oder das Gründungsmitglied enthält das Handle und die ID des Steuerelements, das die Meldung und den Benachrichtigungscode (wie TTN_SHOW) sendet. Das Format der NMHDR-Struktur wird unten angezeigt:
typedef struct tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
Eine TTN_SHOW Meldung würde die Codemember auf TTN_SHOW festgelegt.
Die meisten Benachrichtigungen übergeben einen größeren Zeiger auf eine Struktur, die eine NMHDR-Struktur als erster Member enthält. Betrachten Sie beispielsweise die Struktur als Verwendung durch die LVN_KEYDOWN Benachrichtigung des Listenansicht-Steuerelements, die gesendet wird, wenn eine Taste ein Listenansicht-Steuerelement gedrückt wird. Der Zeiger wird auf LV_KEYDOWN einer Struktur, die wie weiter unten definiert wird:
typedef struct tagLV_KEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} LV_KEYDOWN;
Beachten Sie, wie der Member NMHDR zunächst in dieser Struktur ist, der Zeiger, den Sie in die Benachrichtigung können einem Zeiger auf NMHDR oder ein Zeiger auf LV_KEYDOWN umgewandelt werden entweder übergeben werden.
Benachrichtigungen häufig zu allen neuen Windows-Steuerelementen
Einige Benachrichtigungen sind allen neuen Windows-Steuerelementen häufig. Diese Benachrichtigungen übergeben einen Zeiger auf eine NMHDR-Struktur.
Benachrichtigungscode |
Gesendet da |
---|---|
NM_CLICK |
Benutzer klicken auf linke Maustaste im Steuerelement |
NM_DBLCLK |
Benutzer doppelt geklickt hat auf linke Maustaste im Steuerelement |
NM_RCLICK |
Benutzer klicken auf rechten Maustaste in Steuerelement |
NM_RDBLCLK |
Benutzer doppelt geklickt hat auf rechten Maustaste in Steuerelement |
NM_RETURN |
Benutzer könnten die EINGABETASTE während Steuerelement den Eingabefokus hat |
NM_SETFOCUS |
Steuerelement ist angegebener Eingabefokus erwiesen |
NM_KILLFOCUS |
Steuerelement verloren Eingabefokus hat |
NM_OUTOFMEMORY |
Steuerelement könnte einen Vorgang nicht abgeschlossen werden, da nicht genügend verfügbarer Arbeitsspeicher hat |
ON_NOTIFY: Meldungen der Behandlungs-WM NOTIFY in MFC-Anwendungen
Die CWnd::OnNotify Handlebenachrichtigungsmeldungen func. Die Standardimplementierung überprüft die Meldungszuordnung, sodass Benachrichtigungshandler aufrufen. Im Allgemeinen überschreiben Sie nicht OnNotify. Stattdessen stellen Sie eine Handlerfunktion bereit und fügen einen Eintrag in der Meldungszuordnung für diesen Handler der Meldungszuordnung der Klasse des Besitzerfensters hinzu.
Der Klassen-Assistent, zum ClassWizard-Eigenschaftenblatt, kann den ON_NOTIFY Eintrag in der Meldungszuordnung erstellen und mit einer Skeletthandlerfunktion bereitgestellt. Weitere Informationen zur Verwendung von die, um dies zu erleichtern, finden Sie unter Zuordnungs-Meldungen auf Funktionen.
Das ON_NOTIFY Meldungszuordnungsmakro hat die folgende Syntax:
ON_NOTIFY( wNotifyCode, id, memberFxn )
von wo die kursiv gedruckten Parameter ersetzt werden:
wNotifyCode
Der Code, um die Benachrichtigung, wie LVN_KEYDOWN behandelt werden kann.id
Der untergeordnete Bezeichner des Steuerelements, für das die Benachrichtigung gesendet wird.memberFxn
Die Memberfunktion, aufgerufen werden, wenn diese Benachrichtigung gesendet wird.
muss die Memberfunktion mit folgendem Prototyp deklariert werden:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
Hinweise
wobei die kursiv gedruckten Parameter sind:
pNotifyStruct
Ein Zeiger auf Benachrichtigungsstruktur, 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 Meldungen von CListCtrl verarbeiten soll mit der ID IDC_LIST1, müsste die verwenden um Folgendes der Meldungszuordnung hinzuzufügen:
ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )
Im Beispiel oben, ist die Funktion, die durch die 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 die einen Zeiger des richtigen Typs automatisch bereitstellt. Sie können auf die Benachrichtigungsstruktur entweder von pNMHDR oder pLVKeyDow zugreifen.
ON_NOTIFY_RANGE
Wenn Sie dieselbe WM_NOTIFY Nachricht für einen Satz von Steuerelementen verarbeiten müssen, können Sie ON_NOTIFY_RANGE anstelle von ON_NOTIFY verwenden. Möglicherweise haben Sie eine Gruppe von Schaltflächen, für die Sie die gleiche Aktion für eine bestimmte Benachrichtigung ausführen möchten.
Wenn Sie ON_NOTIFY_RANGE verwenden, geben Sie einen zusammenhängenden Bereich von untergeordneten Bezeichner, sodass die bearbeiten die Benachrichtigung durch Angeben der untergeordneten Bezeichner von Anfang und Ende des Bereichs.
Der Klassen-Assistent behandelt keine ON_NOTIFY_RANGE; um ihn verwenden zu können, müssen Sie die Meldungszuordnung bearbeiten sich.
Der Eintrag in der Meldungszuordnung und der Funktionsprototyp für ON_NOTIFY_RANGE sind, wie folgt:
ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )
von wo die kursiv gedruckten Parameter ersetzt werden:
wNotifyCode
Der Code, um die Benachrichtigung, 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, wenn diese Benachrichtigung gesendet wird.
muss die Memberfunktion mit folgendem Prototyp deklariert werden:
afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Hinweise
wobei die kursiv gedruckten Parameter sind:
id
Der untergeordnete Bezeichner des Steuerelements, das die Benachrichtigung gesendet.pNotifyStruct
Ein Zeiger auf Benachrichtigungsstruktur, 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 in Benachrichtigungsrouting eine Meldung verarbeiten soll, können Sie ON_NOTIFY_EX (oder ON_NOTIFY_EX_RANGE) und nicht ON_NOTIFY (oder ON_NOTIFY_RANGE). Der einzige Unterschied zwischen der EX-Version und der reguläre Version ist, dass die Memberfunktion, die für die EX-Version aufgerufen wird, BOOL zurückgibt, die angibt, ob Meldungsverarbeitung von fortgesetzt werden soll. Die Rückgabe von FALSE dieser Funktion ermöglicht Ihnen, die gleiche Meldung in mehr als einem Objekt zu verarbeiten.
Der Klassen-Assistent behandelt nicht ON_NOTIFY_EX oder ON_NOTIFY_EX_RANGE; wenn Sie einen davon verwenden möchten, müssen Sie die Meldungszuordnung bearbeiten sich.
Der Eintrag in der Meldungszuordnung und der Funktionsprototyp für ON_NOTIFY_EX und ON_NOTIFY_EX_RANGE sind die folgenden. Die Bedeutung der Parameter sind mit denen für Nicht- die EX-Versionen.
ON_NOTIFY_EX( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )
Der Prototyp für beide der obigen ist identisch:
afx_msg BOOL memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Hinweise
In beiden Fällen unterbricht id den untergeordneten Bezeichner des Steuerelements an, die die Benachrichtigung gesendet.
Die Funktion muss TRUE zurückgeben, wenn die Benachrichtigung vollständig oder FALSE behandelt wurde, wenn andere Objekte im Befehlsrouting eine Möglichkeit haben, die Meldung zu bearbeiten.