Freigeben über


TN014: Benutzerdefinierte Steuerelemente

Dieser Hinweis wird die MFC-Unterstützung für die benutzerdefinierten Steuerelemente und Selbstzeichnungen.Es beschreibt auch dynamisches Erstellen von Unterklassen und beschreibt die Beziehung zwischen CWnd-Objekten und HWND s.

Die MFC-Beispielanwendung CTRLTEST veranschaulicht, wie viele benutzerdefinierte Steuerelement verwendet.Siehe den Quellcode für das allgemeine Beispiel CTRLTEST MFC und Onlinehilfe.

Ownerdrawn-Kontrollen/Menüs

Windows bietet Unterstützung für ownerdrawn Steuerelementen und Menüs, indem Windows-Meldungen verwendet.Das übergeordnete Fenster eines beliebigen Steuerelements oder Menüs erhält diese Meldungen und ruft Funktionen in der Antwort an.Sie können diese Funktionen überschreiben, um das Erscheinungsbild und das Verhalten des Steuerelements ownerdrawn oder - Menüs anzupassen.

MFC unterstützt direkt ownerdrawn mit den folgenden Funktionen:

Sie können diese Funktionen in der CWnd abgeleiteten Klasse überschreiben, um benutzerdefinierte Zeichnen von Verhalten zu implementieren.

Dieser Ansatz führt nicht zu wiederverwendbaren Code.Wenn Sie zwei ähnliche Steuerelemente in zwei verschiedenen CWnd-Klassen haben, müssen Sie das benutzerdefinierte Verhalten in zwei Speicherorten implementieren.Die Architektur der MFC-unterstützte Selbstzeichnunge Steuerelements löst dieses Problem.

Selbstzeichnunge Menüs und Steuerelemente

MFC stellt eine Standardimplementierung (in CWnd und CMenu-Klassen) für die standardmäßige ownerdrawn Meldungen bereit.Diese Standardimplementierung decodiert den ownerdrawn Parametern und delegiert die Meldungen ownerdrawn Steuerelementen oder im Menü.Dadurch wird das Zeichnen Selbstzeichnung, da der Code in der Klasse des Steuerelements oder eines Menüs und nicht im Besitzerfenster aufgerufen.

Mit Selbstzeichnunge Steuerelemente verwenden, können Sie wiederverwendbare Steuerelementklassen erstellen, die Semantik ownerdrawn verwenden, um das Steuerelement anzuzeigen.Der Code für das Zeichnen des Steuerelements ist in der Steuerelementklasse nicht das übergeordnete Element.Dies ist ein objektorientierten Ansatz an das benutzerdefinierte Steuerelement programmierung.Fügen Sie die folgende Liste der Funktionen des Selbstzeichnungen Klassen hinzufügen:

  • Für Selbstzeichnunge Schaltflächen:

    CButton:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw this button
    
  • Für Selbstzeichnunge Menüs:

    CMenu:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this menu
    CMenu:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this menu
    
  • Für Selbstzeichnunge Listenfelder:

    CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this list box
    CListBox:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this list box
    
    CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
            // insert code to compare two items in this list box if LBS_SORT
    CListBox:DeleteItem(LPDELETEITEMSTRUCT);
            // insert code to delete an item from this list box
    
  • Für Selbstzeichnunge Kombinationsfelder:

    CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
            // insert code to measure the size of an item in this combo box
    CComboBox:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw an item in this combo box
    
    CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
            // insert code to compare two items in this combo box if CBS_SORT
    CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
            // insert code to delete an item from this combo box
    

Ausführliche Informationen zu den ownerdrawn strukturen (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT und DELETEITEMSTRUCT) finden Sie CWnd::OnDrawItem MFC-Dokumentation für die CWnd::OnMeasureItem, und CWnd::OnDeleteItem, CWnd::OnCompareItem.

Verwenden von Selbstzeichnungen Steuerelemente und der Menüs

Für Selbstzeichnunge Menüs müssen Sie die OnMeasureItem und OnDrawItem-Methode überschreiben.

Für Selbstzeichnunge Listen- und Kombinationsfelder müssen Sie OnMeasureItem und OnDrawItem überschreiben.Sie müssen das LBS_OWNERDRAWVARIABLE Format für Listenfelder oder CBS_OWNERDRAWVARIABLE Format für Kombinationsfelder in der Dialogfeldvorlage angeben.Das Format OWNERDRAWFIXED funktioniert nicht mit Selbstzeichnungen Elementen, da die feste Höhe des Elements bestimmt wird, bevor Selbstzeichnunge Steuerelemente an das Listenfeld angefügt werden.(Sie können die Methoden CListBox::SetItemHeight und CComboBox::SetItemHeight verwenden, um diese Einschränkung zu umgehen.)

OWNERDRAWVARIABLE Wechsel zu einem Format erzwingt das System das Format NOINTEGRALHEIGHT auf das Objekt angewendet werden soll.Da das Steuerelement eine ganzzahlige Variable mit Höhe nicht erheblich - Elemente abgeleitet werden kann, wird das Standardformat von INTEGRALHEIGHT ignoriert, und das Steuerelement ist immer NOINTEGRALHEIGHT.Wenn die Höhe Elemente korrigiert werden, können Sie partielle Elementen gezeichnet werden, verhindern, indem Sie die Steuerelementgröße angeben, um ein ganzzahliger Multiplikator der Elementgröße an sein-.

Für Selbstzeichnunge Listen- und Kombinationsfelder mit dem LBS_SORT oder CBS_SORT Format, müssen Sie die OnCompareItem-Methode überschreiben.

Für Selbstzeichnunge Listen- und Kombinationsfelder OnDeleteItem wird normalerweise nicht überschrieben.Sie können OnDeleteItem überschreiben, wenn Sie eine spezielle Verarbeitung ausgeführt werden soll.Ein Fall, in dem dieser anwendbar ist, ist, wenn zusätzlicher Speicher oder andere Ressourcen Listenfeld- mit jedem Element im Kombinationsfeld oder gespeichert werden.

Beispiele für Selbstzeichnungen von Menüs und Steuerelemente

Das allgemeine Beispiel CTRLTEST MFC stellt Beispiele Selbstzeichnungen eines Menüs und des Selbstzeichnungen Listenfelds.

Das gängigste Beispiel für eine Selbstzeichnungen Schaltfläche ist eine Bitmap Button.Eine Bitmap Button ist eine Schaltfläche, die ein, zwei oder drei Bitmapbilder für die unterschiedlichen Zustände anzeigt.Ein Beispiel hierfür ist in der MFC-Klasse CBitmapButton bereitgestellt.

Dynamisches Erstellen von Unterklassen

Gelegentlich möchten Sie die Funktionalität eines Objekts ändern, das bereits vorhanden ist.Die vorherigen Beispiele erforderlich, um die Steuerelemente anzupassen, bevor sie erstellt wurden.Dynamisches Erstellen von Unterklassen ermöglicht es Ihnen, ein Steuerelement anzupassen, das bereits erstellt wurde.

Erstellen von Unterklassen ist der Windows-Ausdruck zum Ersetzen WndProc eines Fensters mit benutzerdefinierten WndProc und das Aufrufen alten WndProc für die Standardfunktionalität.

Dies darf nicht mit C++-Klassen ableitung verwechselt werden.Eine Erläuterung sind die C++-Ausdrücke Basisklasse als auch die abgeleitete Klasseübergeordnete Klasse unter Windows-Objektmodell im und ordnen analog.C++-Ableitung mit MFC- und Windows-Unterordnen sind funktional vergleichbar, außer dynamische Erstellen von Unterklassen C++ nicht unterstützt.

Die CWnd-Klasse stellt die Verbindung zwischen Objekt in C-Format ++ (abgeleitet von CWnd) und einem Windows-Fensterobjekt (bekannt als HWND).

Es gibt drei allgemeine Arten mit dieser verknüpft sind:

  • CWnd erstellt HWND.Sie können das Verhalten in einer abgeleiteten Klasse ändern, indem Sie eine Klasse erstellen, die von CWnd abgeleitet ist.HWND wird erstellt, wenn die Anwendung CWnd::Create aufruft.

  • Die Anwendung fügt CWnd in ein vorhandenes HWND an.Das Verhalten des vorhandenen Fensters wird nicht geändert.Dabei handelt es sich um einen Fall aus der Delegierung und möglich gemacht, indem CWnd::Attach auf den Alias zu einem CWndHWND vorhandenes Objekt aufgerufen wird.

  • CWnd wird in ein vorhandenes HWND angefügt und Sie können das Verhalten in einer abgeleiteten Klasse ändern.Dies wird als dynamisches Erstellen von Unterklassen, da das Verhalten ändern, sodass die Klasse, eines Windows-Objekts zur Laufzeit aufgerufen.

Sie können dynamisches Erstellen von Unterklassen erzielen, indem Sie die Methoden CWnd::SubclassWindow und CWnd::SubclassDlgItem verwenden.

Beide Routinen fügen ein CWnd-Objekt in ein vorhandenes HWND an.SubclassWindow akzeptiert HWND direkt.SubclassDlgItem ist eine Hilfsfunktion, die eine Steuerelement-ID und das übergeordnete Fenster verwendet.SubclassDlgItem ist für das Anfügen von C++-Objekten zum Dialogfeld Steuerelemente, die von einer Dialogfeldvorlage erstellt werden.

Weitere Informationen finden Sie im CTRLTEST Beispiel für einige Beispiele dafür, wann SubclassWindow und SubclassDlgItem verwendet.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie