Diese technische Applikationsschrift beschreibt Meldungsreflektion, ein neues Feature in MFC 4.0. Es enthält auch Anweisungen zum Erstellen eines einfachen wiederverwendbaren Steuerelements, das Meldungsreflektion verwendet.
Dieser technische Hinweis wird Meldungsreflektion nicht besprochen, wie sie ActiveX-Steuerelemente (früher OLE-Steuerelemente genannt) angewendet wird. Bitte finden Sie im Artikel ActiveX-Steuerelemente: bilden von Unterklassen für ein Windows-Steuerelement im Visual C++ Programmer's Guide.
Was ist Meldungsreflektion?
Windows-Steuerelemente häufig Benachrichtigungen an ihre übergeordneten Fenster gesendet. Beispielsweise senden viele Steuerelemente ein Steuerelement Farbe Benachrichtigung (WM_CTLCOLOR oder einer seiner Varianten) Eltern erlauben das übergeordnete Element ein Pinsels für den Hintergrund des Steuerelements bereitstellen.
In Windows und in MFC, Version 4.0 ist das übergeordnete Fenster, oft ein Dialogfeld, für die Verarbeitung dieser Nachrichten verantwortlich. Dies bedeutet, dass der Code für die Behandlung der Meldung in das übergeordnete Fenster Klasse sein muss und dass es in jeder Klasse dupliziert werden, die die Nachricht verarbeiten muss. Im obigen Fall müsste jedes Dialogfeld, in dem Steuerelemente mit benutzerdefinierten Hintergrund wollte die Steuerelement-Benachrichtigung Farbe behandeln. Es wäre viel einfacher, Code wiederverwenden, wenn eine Control-Klasse geschrieben werden kann, dass die eigene Hintergrundfarbe behandeln würde.
In MFC 4.0, der alte Mechanismus noch funktioniert — übergeordneten Windows können Benachrichtigungen behandeln. Darüber hinaus jedoch MFC 4.0 erleichtert Wiederverwendung durch die Bereitstellung ein Feature namens "Meldung Reflexion" können diese Benachrichtigungen entweder das ChildWindow-Steuerelement oder das übergeordnete Fenster, oder in beiden behandelt werden. Im Steuerelement Hintergrund Farbe Beispiel, können Sie nun eine Control-Klasse, die eine eigene Hintergrundfarbe festlegt, durch Behandeln der reflektierten WM_CTLCOLOR -Nachricht schreiben — alles, ohne sich auf das übergeordnete Element. (Beachten Sie, dass da Meldungsreflektion von MFC implementiert ist, nicht von Windows, die übergeordnete Fensterklasse CWnd für Meldungsreflektion arbeiten abgeleitet werden muss.)
Ältere Versionen von MFC hat etwas ähnlich Meldungsreflektion durch virtuelle Funktionen für einige Nachrichten, z. B. Nachrichten für Ownerdrawn-Listenfeldern (WM_DRAWITEMusw.). Der neue Nachricht Reflexion Mechanismus ist generalisierte und konsistente.
Meldungsreflektion ist abwärtskompatibel mit Code für die MFC-Versionen vor 4.0.
Wenn Sie einen Handler für eine bestimmte Nachricht geliefert haben, oder für eine Reihe von Nachrichten, in Ihre übergeordnete Fenster-Klasse es überschreibt reflektiert Meldungshandler für dieselbe Nachricht, sofern Sie nicht in Ihren eigenen Handler Handler-Funktion die Basisklasse aufrufen. Beispielsweise wenn Sie WM_CTLCOLOR in der Dialogfeldklasse behandeln, wird Ihre Behandlung reflektierte Meldungshandler überschreiben.
Wenn Sie in Ihre übergeordnete Window-Klasse, einen Handler für ein bestimmtes WM_NOTIFY -Meldung oder einen Bereich von WM_NOTIFY -Nachrichten angeben, wird der Handler nur, wenn das untergeordnete Steuerelement senden diese Nachrichten keinen reflektierte Meldungshandler durch ON_NOTIFY_REFLECT()aufgerufen. Verwenden Sie ON_NOTIFY_REFLECT_EX() in der Meldungszuordnung, Ihre Meldungshandler kann oder kann nicht das übergeordnete Fenster, die Nachricht zu verarbeiten. Wenn der Ereignishandler TRUEzurückgibt, wird die Nachricht vom übergeordneten als auch während eines Anrufs behandelt werden, die zurückgibt, dass falsche nicht das übergeordnete Element, damit umzugehen zulässt. Beachten Sie, dass die reflektierte Nachricht vor der Nachricht behandelt wird.
Wenn eine WM_NOTIFY -Nachricht gesendet wird, wird das Steuerelement zuerst die Möglichkeit, damit umzugehen angeboten. Wenn jede andere reflektierte Nachricht gesendet wird, das übergeordnete Fenster hat die erste Chance, es zu behandeln, und das Steuerelement wird die reflektierte Meldung. Hierzu benötigen sie eine Handlerfunktion und ein entsprechender Eintrag in der Meldungszuordnung des Steuerelements-Klasse.
Das Makro Meldungszuordnung für reflektierte Meldungen ist etwas anders als für regelmäßige Benachrichtigungen: Es hat _REFLECT an seinen üblichen Namen angehängt. Zum Beispiel, um eine WM_NOTIFY -Meldung in das übergeordnete Element zu behandeln, verwenden Sie das Makro ON_NOTIFY in der übergeordneten Nachricht anzeigen. Verwenden Sie die reflektierte Meldung im untergeordneten Steuerelement das ON_NOTIFY_REFLECT -Makro in das untergeordnete Steuerelement die Meldung anzeigen. In einigen Fällen sind die Parameter auch anders. Beachten Sie, dass Klassen-Assistent kann in der Regel die Meldungszuordnungseinträge für Sie hinzufügen und Skelett Funktion Implementierungen mit korrekten Parametern bereitstellen.
Finden Sie unter TN061: ON_NOTIFY und WM_NOTIFY-Nachrichten für Informationen über die neuen WM_NOTIFY -Meldung.
Meldungszuordnungseinträge und Funktionsprototypen Handler für reflektierte Meldungen
Verwenden Sie eine reflektierte Steuerelement-Benachrichtigung die Meldungszuordnung Makros und Funktionsprototypen, die in der nachstehenden Tabelle aufgeführten.
Klassen-Assistent kann in der Regel diese Meldungszuordnungseinträge für Sie hinzufügen und Skelett Funktion Implementierungen bereitstellen. Finden Sie unter definieren einen Meldungshandler für eine Meldung reflektiert , im Visual C++ Programmer's Guide Informationen zum Definieren von Handlern für Nachrichten wiedergegeben.
Zum Konvertieren von des Namens der Nachricht in den reflektierten Makronamen anstellen Sie ON_ vor und fügen Sie _REFLECT an. Beispielsweise wird WM_CTLCOLOR ON_WM_CTLCOLOR_REFLECT. (Sehen, welche Nachrichten wiedergegeben werden können, führen Sie die entgegengesetzte Umwandlung auf die Makro-Einträge in der Tabelle unten.)
Die drei Ausnahmen von der Regel oben sind wie folgt:
In jedem der oben genannten besonderen Fällen müssen Sie den Namen der Memberfunktion Handler angeben. In den anderen Fällen müssen Sie den standard-Namen für die Handlerfunktion verwenden.
Die Bedeutung der Parameter und Rückgabewerte der Funktionen sind unter den Namen der Funktion oder der Funktionsname mit auf vorangestellt dokumentiert. Beispielsweise CtlColor vor in OnCtlColordokumentiert. Mehrere reflektierte Meldungshandler benötigen weniger Parameter als in der ähnlichen Handler in ein übergeordnetes Fenster. Nur übereinstimmen Sie die Namen in der Tabelle unten die Namen der formalen Parameter in der Dokumentation.
| Eintrag anzeigen | Funktionsprototyp |
| ON_CONTROL_REFLECT ( wNotifyCode, MemberFxn ) | Afx_msg voidmemberFxn ( ); |
| ON_NOTIFY_REFLECT ( wNotifyCode, MemberFxn ) | Afx_msg voidmemberFxn(NMHDR * pNotifyStruct, LRESULT * Ergebnis ); |
| ON_UPDATE_COMMAND_UI_REFLECT ( MemberFxn ) | Afx_msg voidmemberFxn(CCmdUI * pCmdUI ); |
| (ON_WM_CTLCOLOR_REFLECT) | Afx_msg HBRUSH CtlColor vor (CDC * pDC, UINT nCtlColor ); |
| (ON_WM_DRAWITEM_REFLECT) | Afx_msg void DrawItem (LPDRAWITEMSTRUCT LpDrawItemStruct ); |
| (ON_WM_MEASUREITEM_REFLECT) | Afx_msg void MeasureItem (LPMEASUREITEMSTRUCT LpMeasureItemStruct ); |
| (ON_WM_DELETEITEM_REFLECT) | Afx_msg void DeleteItem (LPDELETEITEMSTRUCT LpDeleteItemStruct ); |
| (ON_WM_COMPAREITEM_REFLECT) | Afx_msg Int CompareItem (LPCOMPAREITEMSTRUCT LpCompareItemStruct ); |
| (ON_WM_CHARTOITEM_REFLECT) | Afx_msg Int CharToItem (UINT NT aste, UINT nIndex ); |
| (ON_WM_VKEYTOITEM_REFLECT) | Afx_msg Int VKeyToItem (UINT NT aste, UINT nIndex ); |
| (ON_WM_HSCROLL_REFLECT) | Afx_msg void HScroll (UINT nSBCode, UINT nPos ); |
| (ON_WM_VSCROLL_REFLECT) | Afx_msg void VScroll (UINT nSBCode, UINT nPos ); |
| (ON_WM_PARENTNOTIFY_REFLECT) | Afx_msg void ParentNotify (UINT Nachricht, LPARAM lParam ); |
Die Makros ON_NOTIFY_REFLECT und ON_CONTROL_REFLECT haben Variationen, die mehr als ein Objekt (z. B. das Steuerelement und dem übergeordneten) erlauben, eine bestimmte Nachricht zu behandeln.
| Eintrag anzeigen | Funktionsprototyp |
| ON_NOTIFY_REFLECT_EX ( wNotifyCode, MemberFxn ) | Afx_msg BOOLmemberFxn(NMHDR * pNotifyStruct, LRESULT * Ergebnis ); |
| ON_CONTROL_REFLECT_EX ( wNotifyCode, MemberFxn ) | Afx_msg BOOLmemberFxn ( ); |
Handhabung reflektiert Nachrichten: Ein Beispiel für eine wiederverwendbare Steuerelement
Dieses einfache Beispiel erstellt eine wiederverwendbare Steuerelement namens CYellowEdit . Das Steuerelement funktioniert genauso wie eine regelmäßige Edit-Steuerelement mit der Ausnahme, dass schwarzen Text auf gelbem Hintergrund angezeigt. Es wäre einfach zu Memberfunktionen hinzufügen, würde der CYellowEdit Steuerelement zum Anzeigen von verschiedener Farben.
Führen Sie die folgenden Schritte aus, um dieses Beispiel ausprobieren,:
Sie müssen eine Anwendung, das wiederverwendbare Steuerelement entwickeln. Haben Sie eine vorhandene Anwendung zu verwenden, erstellen Sie eine auf Dialogfeldern basierende Anwendung mithilfe der Anwendungs-Assistent.
CYellowEdit auf der Grundlage von CEdit. Lassen Sie das "Zu Komponentensammlung hinzufügen" aktiviert.CYellowEdit Klasse. Die ersten beiden werden COLORREF -Variablen, um die Textfarbe und die Hintergrundfarbe aufzunehmen. Die dritte wird ein CBrush -Objekt, die den Pinsel für den Hintergrund halten wird. Dem CBrush -Objekt können Sie den Pinsel einmal, lediglich darauf verweisen, nach dem Erstellen und den Pinsel automatisch beim Zerstören der CYellowEdit Steuerelement wird zerstört.CYellowEdit::CYellowEdit()
{
M_clrText = RGB (0, 0, 0);
M_clrBkgnd = RGB (255, 255, 0);
m_brBkgnd.CreateSolidBrush (M_clrBkgnd);
}
CYellowEdit Klasse. Beachten Sie, dass das Gleichheitszeichen an den Namen der Nachricht in der Liste der Nachrichten, die Sie behandeln können, zeigt an, dass die Meldung reflektiert wird. Beschrieben wird dies im definieren einen Meldungshandler für eine Meldung reflektiert , im Visual C++ Programmer's Guide.ClassWizard fügt die folgende Meldungszuordnung Makro und Skelett-Funktion für Sie:
ON_WM_CTLCOLOR_REFLECT()
/ / Hinweis: andere Code dazwischen werden....
HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) {}
/ / TODO: Ändern Sie alle Attribute des DC hier
/ / TODO: ein nicht-NULL-Brush zurück, wenn die
/ / den übergeordneten Handler sollte nicht aufgerufen werden
NULL zurück;
}
pDC-Gt;SetTextColor (M_clrText); / / Text
pDC - > SetBkColor (M_clrBkgnd); / / Text Hintergr. /
Rückkehr M_brBkgnd; / / Ctl Hintergr. /
CYellowEdit -Steuerelement in das Dialogfeld Header-Datei.CYellowEdit -Klasse, um andere Projekte zu steuern.Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie