TN062: Meldungs-Reflektion für Windows-Steuerelemente

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 Meldung beschreibt, Reflektion eine neue Funktion in MFC 4.0.Er enthält auch Anweisungen zum Erstellen eines einfachen wiederverwendbaren Steuerelements, das die Reflektion verwendet.

In diesem technischen Hinweis wird erläutert, wie sie Reflektion Nachrichten nicht für ActiveX-Steuerelemente gelten (früher OLE-Steuerelemente bezeichnet).Weitere Informationen finden Sie in den Artikeln ActiveX-Steuerelemente: Ein Windows-Steuerelement unterordnen.

Was ist Meldungs-Reflektion?

Häufig senden Windows-Steuerelemente Benachrichtigungsmeldungen zu ihren übergeordneten Fenster.Zum Beispiel senden viele Steuerelemente Farben Steuerelements eine benachrichtigungsmeldung WM_CTLCOLOR (oder eine der Varianten) zum übergeordneten Element, das dem übergeordneten Element zu ermöglichen, um einen Pinsel zum Zeichnen des Hintergrunds des Steuerelements anzugeben.

In Windows und in MFC vor Version 4.0, ist das übergeordnete Fenster häufig ein Dialogfeld zur Behandlung dieser Nachrichten verantwortlich.Dies bedeutet, dass der Code für die Behandlung der Meldung in der Klasse des übergeordneten Fensters sein muss und dass sie in jeder Klasse dupliziert werden muss, die diese Meldung bearbeiten muss.Im Fall eines oben Dialogfeld für die gewünschten Steuerelemente mit benutzerdefinierten Farben benachrichtigungsmeldung Hintergründen das Steuerelement bearbeiten können.Es ist viel einfacher sein, Code wiederverwenden, wenn eine Steuerelementklasse geschrieben werden kann, die seine eigene Hintergrundfarbe behandelt werden würde.

In MFC 4.0, funktioniert der alte Mechanismus weiterhin — übergeordnete Fenster können Benachrichtigungsmeldungen bearbeiten.Außerdem erleichtert jedoch MFC 4.0 Wiederverwendung, indem eine Funktion enthält, die "Meldungen" Reflektion aufgerufen wird, kann dieser die im Fenster des untergeordneten Steuerelements oder im übergeordneten Fenster behandelt werden soll, entweder Benachrichtigungsmeldungen oder beidem.Im Beispiel hintergrundfarben Steuerelements können Sie eine Steuerelementklasse jetzt schreiben, die über eine eigene Hintergrundfarbe festlegen, indem Sie die reflektierte Meldung WM_CTLCOLOR — all behandelt, ohne auf das übergeordnete Element zu verlassen.(Beachten Sie, dass durch Reflektion Nachrichten, da MFC nicht von Windows, die Klasse des übergeordneten Fensters Implementierung von CWnd abgeleitet sein muss, damit die Reflektion verwendet).

Frühere Versionen von MFC haben einige Nachrichten für die Reflektion, indem sie Meldungen für mehrere virtuelle Funktionen, z. B. listenfelder (ownerdrawn Nachrichten für WM_DRAWITEM usw.) bereitgestellt haben.Der neue Meldung und reflektions generalisiert Mechanismus zur ist konsistent.

Reflektion Nachrichten ist abwärtskompatibel mit dem Code, der für die Versionen von MFC vor 4.0 geschrieben werden soll.

Wenn Sie einen Handler für eine bestimmte Nachricht oder für einen Bereich von Meldungen in der Klasse des übergeordneten Fensters angegeben haben, überschreibt sie reflektierte Meldungshandler für dieselbe Nachricht wurde von der Basisklasse nicht aufgerufen handlerfunktion in Ihrem eigenen Handler.Wenn Sie beispielsweise WM_CTLCOLOR in der Dialogfeldklasse behandeln, überschreibt die Behandlung alle reflektierten Meldungshandler.

Wenn in der Klasse des übergeordneten Fensters Sie einen Handler für eine bestimmte WM_NOTIFY Nachricht oder einen Bereich von Nachrichten WM_NOTIFY bereitstellen, wird der Handler nur aufgerufen, wenn das untergeordnete Steuerelement, das diese Meldungen sendet, einen reflektierten Meldungshandler nicht durch ON_NOTIFY_REFLECT() verfügt.Wenn Sie ON_NOTIFY_REFLECT_EX() in der Meldungszuordnung verwenden, kann möglicherweise ein Meldungshandler dem übergeordneten Fenster, um die Meldung zu bearbeiten.Wenn der Handler FALSE zurückgibt, wird die Nachricht vom übergeordneten Element ebenfalls verarbeitet, während ein Aufruf, der TRUE zurückgibt, nicht dem übergeordneten Element erlaubt, um es zu behandeln.Beachten Sie, dass die reflektierte Meldung vor der Benachrichtigungsmeldung verarbeitet wird.

Wenn eine WM_NOTIFY Nachricht gesendet wird, wird das Steuerelement die erste Möglichkeit bereitgestellt, sie zu verarbeiten.Wenn ein anderer reflektierte Meldung gesendet wird, hat das übergeordnete Fenster die erste Möglichkeit, sie zu behandeln und das Steuerelement erhält die reflektierte Meldung.Dazu muss es sich um eine Handlerfunktion und einen entsprechenden Eintrag in die Klassen meldungszuordnung des Steuerelements.

Das Meldungszuordnungs Makro für reflektierte Meldungen ist etwas anders als für reguläre Benachrichtigungen: hat _REFLECT, das auf den üblichen Namen angefügt wird.Um beispielsweise eine WM_NOTIFY Meldung im übergeordneten Element zu bearbeiten, verwenden Sie Makro- ON_NOTIFY in der Meldungszuordnung des übergeordneten Elements.Um die reflektierte Meldung im untergeordneten Steuerelement zu bearbeiten, verwenden Sie die ON_NOTIFY_REFLECT Makro in der Meldungszuordnung des untergeordneten Steuerelements.In manchen Fällen sind die Parameter, auch anders.Beachten Sie, dass die ClassWizard Meldungszuordnungseinträge für Sie normalerweise hinzufügen und funktions Skelett von Implementierungen mit den entsprechenden Parameter enthalten kann.

Weitere Informationen dazu finden Sie TN061: ON_NOTIFY- und WM_NOTIFY-Meldungen die neue WM_NOTIFY Meldung.

Handlerfunktions-Prototypen und Meldungszuordnungseinträge für reflektierte Meldungen

Um eine reflektierte für eine Steuerelementbenachrichtigungs zu bearbeiten, verwenden Sie die Meldungszuordnungs von Makros und die Funktionsprototypen, die in der nachstehenden Tabelle aufgelistet sind.

ClassWizard kann diese Meldungszuordnungseinträge für Sie normalerweise hinzufügen und funktions Skelett von Implementierungen bereitstellen.Weitere Informationen dazu finden Sie Wenn Sie einen Meldungshandler für eine reflektierte Meldung definieren, wie Handler für reflektierte Meldungen definiert.

Um die Namen von Meldungen an den reflektierten Makronamen zu konvertieren, stellen Sie ON_ voran, und fügen Sie _REFLECT an.Beispielsweise wird WM_CTLCOLORON_WM_CTLCOLOR_REFLECT.(Um ermitteln, welche Nachrichten angegeben werden können, führen Sie die entgegengesetzte Konvertierung für den Makro Einträgen in der Tabelle weiter unten.)

Die drei Ausnahmen in der Regel oben lauten wie folgt:

  • Das Makro für WM_COMMAND Benachrichtigungen ist ON_CONTROL_REFLECT.

  • Das Makro für WM_NOTIFY Reflektionen ist ON_NOTIFY_REFLECT.

  • Das Makro für ON_UPDATE_COMMAND_UI Reflektionen ist ON_UPDATE_COMMAND_UI_REFLECT.

In jedem der oben erwähnten speziellen Fällen müssen Sie den Namen der Memberfunktion einer Handler angeben.In anderen Fällen müssen Sie den Standardnamen für eine Handlerfunktion verwenden.

Die Bedeutungen der Parameter und Rückgabewerte von Funktionen werden entweder dem Funktionsnamen den Funktionsnamen oder dokumentiert, die mit Ein voran.Beispielsweise wird CtlColor in OnCtlColor dokumentiert.Einige reflektierte Meldungshandler erfordern weniger Parameter als ähnliche Handler in ein übergeordnetes Fenster.Entsprechung für einfach die Namen in der nachstehenden Tabelle mit den Namen der formalen Parameter in der Dokumentation ab.

Eintrag Zuordnungen

Funktionsprototyp

ON_CONTROL_REFLECT( wNotifyCode, memberFxn )

afx_msg void memberFxn ( );

ON_NOTIFY_REFLECT( wNotifyCode, memberFxn )

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

ON_UPDATE_COMMAND_UI_REFLECT( memberFxn )

afx_msg void memberFxn ( CCmdUI* pCmdUI);

ON_WM_CTLCOLOR_REFLECT ()

afx_msg HBRUSH CtlColor ( 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 nKey, UINT nIndex);

ON_WM_VKEYTOITEM_REFLECT ()

afx_msg int VKeyToItem ( UINT nKey, 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 message, LPARAM lParam);

Die ON_NOTIFY_REFLECT und ON_CONTROL_REFLECT Makros sind Variationen, die mehr als einem Objekt (z. B. das Steuerelement und seinem übergeordneten Element zugelassen) eine bestimmte Meldung zu bearbeiten.

Eintrag Zuordnungen

Funktionsprototyp

ON_NOTIFY_REFLECT_EX( wNotifyCode, memberFxn )

Ergebnis);afx_msg BOOL memberFxn ( NMHDR * pNotifyStruct, LRESULT*

ON_CONTROL_REFLECT_EX( wNotifyCode, memberFxn )

afx_msg BOOL memberFxn ( );

Reflektierte Meldungen verarbeiten: Ein Beispiel für einen wiederverwendbaren Steuerelements

Dieses einfache Beispiel wird ein wiederverwendbares Steuerelement, das CYellowEdit aufgerufen wird.Das Steuerelement funktioniert genauso wie ein reguläres Bearbeitungssteuerelement, mit der Ausnahme, dass sie zeigt schwarzen Text auf gelbem Hintergrund an.Es wäre einfach sein, Memberfunktionen hinzuzufügen, die das CYellowEdit-Steuerelement zu verschiedenen Farben der Anzeige können.

Verwenden Sie zum Beispiel versuchen, das ein wiederverwendbares Steuerelement erstellt

  1. Erstellen Sie ein neues Dialogfeld in einer vorhandenen Anwendung erstellt.Weitere Informationen finden Sie unter Dialog-Editor Thema.

    Sie müssen über eine Anwendung verfügen, in der das wiederverwendbare Steuerelement entwickeln.Wenn Sie keine vorhandenen Anwendung verwendet haben, erstellen Sie eine auf Dialogfeldern basierende Anwendung mithilfe des Anwendungs-Assistenten.

  2. Wenn das Projekt in Visual C++ geladen ist, verwenden Sie ClassWizard, um eine neue Klasse zu erstellen, die auf Grundlage CYellowEditCEdit aufgerufen wird.

  3. Fügen Sie der Variablen dreiköpfige CYellowEdit-Klasse hinzu.Die ersten beiden Variablen COLORREF sind, um die Textfarbe und der Hintergrundfarbe zu halten.Das dritte ist ein CBrush-Objekt, das den Pinsel zum Zeichnen des Hintergrunds enthält.Das CBrush-Objekt ermöglicht es Ihnen, den Pinsel erstellt und lediglich einmal nach dem sie verweist, sowie den Pinsel automatisch zerstören, wenn das CYellowEdit-Steuerelement gelöscht wird.

  4. Initialisieren Sie die Membervariablen, indem Sie den Konstruktor schreiben:

    CYellowEdit::CYellowEdit()
    {
       m_clrText = RGB( 0, 0, 0 );
       m_clrBkgnd = RGB( 255, 255, 0 );
       m_brBkgnd.CreateSolidBrush( m_clrBkgnd );
    }
    
  5. Verwenden ClassWizard fügen Sie einen Handler für die reflektierte Meldung WM_CTLCOLOR der CYellowEdit-Klasse hinzu.Beachten Sie, dass das Gleichheitszeichen vor dem Namen der Nachrichten in der Liste der Meldungen angibt, die Sie ändern können, dass die Meldung reflektiert wird.Dies wird in Wenn Sie einen Meldungshandler für eine reflektierte Meldung definieren beschrieben.

    ClassWizard fügt die folgenden Meldungszuordnungs makro- und Skelett für Feature hinzu:

    ON_WM_CTLCOLOR_REFLECT()
    
    // Note: other code will be in between....
    
    HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
       // TODO: Change any attributes of the DC here
    
       // TODO: Return a non-NULL brush if the
       //   parent's handler should not be called
       return NULL;
    }
    
  6. Ersetzen Sie den Text der Funktion durch den folgenden Code.Der Code gibt die Textfarbe, die Text verwendeten Hintergrundfarbe und die Hintergrundfarbe für Rest des Steuerelements an.

       pDC->SetTextColor( m_clrText );   // text
       pDC->SetBkColor( m_clrBkgnd );   // text bkgnd
       return m_brBkgnd;            // ctl bkgnd
    
  7. Erstellen Sie ein Bearbeitungssteuerelement im Dialogfeld, und fügen Sie es in eine Membervariable an, indem Sie das Bearbeitungssteuerelement beim Doppelklicken auf eine STRG gedrückt halten.Klicken Sie im Dialogfeld Hinzufügens-Membervariablen beenden Sie den Variablennamen und wählen Sie "Steuerelement" für die Kategorie "," CYellowEdit für den Variablentyp aus.Vergessen Sie nicht, die Aktivierreihenfolge im Dialogfeld festzulegen.Außerdem müssen Sie die Headerdatei für das CYellowEdit-Steuerelement in der Headerdatei des Dialogfelds einzuschließen.

  8. Erstellen Sie Ihre Anwendung, und führen Sie sie aus.Das Bearbeitungssteuerelement verfügt über einen gelben Hintergrund.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie