Diese Applikationsschrift beschreibt die MFC-Unterstützung für self-drawing und benutzerdefinierte Steuerelemente. Dynamisches Erstellen von Unterklassen ist auch beschrieben. Allgemeine Ratschläge, Besitz von CWnd -Objekten vs. HWNDs wird vorgestellt.
Die MFC-Beispielanwendung CTRLTEST veranschaulicht viele dieser Features. Finden Sie den Quellcode für die allgemeinen MFC-Beispiel CTRLTEST und online-Hilfe.
Ownerdrawn-Steuerelementen/Menüs
Windows bietet Unterstützung für "Besitzerzeichnung" Steuerelemente und Menüs. Dies sind die Windows-Nachrichten an eine übergeordnete Fenster eines Steuerelements oder das Menü, mit denen Sie die visuelle Darstellung und das Verhalten des Steuerelements oder im Menü anpassen.
MFC unterstützt direkt Besitzer zeichnen mit der Nachricht-Zuordnungseinträgen:
Sie überschreiben können, diese in Ihre CWnd-abgeleiteten Klasse (in der Regel ein Dialogfeld oder Hauptrahmenfenster) das Ownerdrawn-Verhalten implementieren.
Dieser Ansatz führt nicht zu wiederverwendbaren Code. Wenn Sie zwei ähnliche Steuerelemente in zwei verschiedenen Dialogen haben, müssen Sie das benutzerdefinierte Steuerelementverhalten an zwei Orten implementieren. Die MFC-gestützte self-drawing Steuerungsarchitektur löst dieses problem.
Self-Drawing-Steuerelemente und Menüs
MFC stellt eine Standardimplementierung (in CWnd und CMenu) für die standard Ownerdrawn-Nachrichten. Diese Standardimplementierung wird die OwnerDraw-Parameter decodieren und delegieren die OwnerDraw-Nachrichten an die Steuerelemente oder das Menü. Dies wird "self-draw" genannt, da der Zeichnung (/ Messen/vergleichen) Code in der Klasse des Steuerelements oder im Menü nicht in das Besitzerfenster ist.
Dadurch können Sie wiederverwendbare Klassen erstellen, die das Steuerelement mithilfe der Semantik "Besitzer zeichnen" anzuzeigen. Der Code zum Zeichnen des Steuerelements, nicht der Besitzer des Steuerelements ist in der Control-Klasse. Dies ist eine Objekt-orientierte Ansatz für benutzerdefiniertes Steuerelement programmieren.
CButton:DrawItem(LPDRAWITEMSTRUCT);
&Nbsp; / / zeichnen diese Schaltfläche
CMenu:MeasureItem(LPMEASUREITEMSTRUCT);
&Nbsp; / / Messen die Größe eines Elements in diesem Menü
CMenu:DrawItem(LPDRAWITEMSTRUCT);
/ / Ziehen Sie ein Element in diesem Menü
CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
&Nbsp; / / Messen die Größe eines Elements in diesem Listenfeld
CListBox:DrawItem(LPDRAWITEMSTRUCT);
/ / in diesem Listenfeld ein Element zu zeichnen
CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / Wenn zwei Elemente in diesem Listenfeld vergleichen LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / Löschen eines Elements aus dem Listenfeld
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
&Nbsp; / / Messen die Größe eines Elements in diesem Kombinationsfeld
CComboBox:DrawItem(LPDRAWITEMSTRUCT);
/ / Ziehen Sie ein Element in das Kombinationsfeld
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / Wenn zwei Elemente in diesem Kombinationsfeld vergleichen CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / Löschen eines Elements aus diese Combo-Box
Für Details über das Ownerdrawn-siehe Strukturen (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTund DELETEITEMSTRUCT) in der MFC-Dokumentation für CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItemund CWnd::OnDeleteItem bzw.
Mithilfe von self-drawing Steuerelementen und Menüs
Self-drawing Menüs müssen Sie das MeasureItem und DrawItem -Memberfunktion überschreiben.
Für self-drawing, Listenfelder und Kombinationsfelder, müssen Sie das MeasureItem und DrawItemüberschreiben. Müssen Sie den OWNERDRAWVARIABLE-Stil in das Dialogfeldvorlage (LBS_OWNERDRAWVARIABLE und CBS_OWNERDRAWVARIABLE beziehungsweise). Der Stil OWNERDRAWFIXED funktioniert nicht mit self-drawing Elementen, da die festen Elementhöhe bestimmt wird, bevor self-drawing Steuerelemente in das Listenfeld angefügt sind. (Win 3.1 Memberfunktionen CListBox::SetItemHeight und CComboBox::SetItemHeight können verwendet werden, um diese Einschränkung zu umgehen.)
Darüber hinaus beachten Sie, dass die Umstellung auf eine OWNERDRAWVARIABLE -Stil den NOINTEGRALHEIGHT Stil auswirken wird. Da das Steuerelement nicht berechnen kann, eine fester Höhe mit variabler Größe, das Standardformat der INTEGRALHEIGHT wird ignoriert und das Steuerelement ist immer NOINTEGRALHEIGHT. Wenn Ihre Elemente Höhe fixiert sind, können Sie Elemente verhindern durch Angabe der Steuerelementgröße ein wesentlicher Multiplikator von der Objektgröße werden gezogen.
Für self-drawing, Listenfelder und Kombinationsfelder mit dem Art-Stil (LBS_SORT und CBS_SORT bzw.), müssen Sie die CompareItem -Memberfunktion überschreiben.
Für self-drawing, Listenfelder und Kombinationsfelder, wird DeleteItem nicht normalerweise überschrieben. DeleteItem kann überschrieben werden, wenn zusätzliche Speicher oder andere Ressourcen mit jedem Listenelement Listenfeld- oder Kombinationsfeld-Feld gespeichert sind.
Beispiele für Self-Drawing Steuerelemente/Menüs
Im allgemeinen MFC-Beispiel CTRLTEST enthält Beispiele für ein self-draw Menü (mit Farben) und eine self-draw Listenfeld (auch mit Farben).
Das typischste Beispiel für eine self-drawing Schaltfläche ist eine Bitmapschaltfläche (eine Schaltfläche, die ein, zwei oder drei Bitmap-Bilder für die unterschiedlichen Zustände zeigt). Dies ist in der MFC-Klasse CBitmapButton bereitgestellt.
Das Erstellen von dynamischen Unterklassen
Das Erstellen von Unterklassen ist der Windows-Begriff für WndProc eines Fensters durch eine unterschiedliche WndProc ersetzen und Aufrufen von alten WndProc für Standardfunktionen (Oberklasse).
Dies sollte nicht verwechselt werden mit Klassenableitung C++ (C++-Terminologie verwendet die Worte "base" und "abgeleitet", während das Windows-Objektmodell "super" und "sub" verwendet). Ableitung von C++ mit MFC und Windows Erstellen von Unterklassen sind funktionell sehr ähnlich, außer C++ nicht unterstützt eine Funktion ähnlich wie das Erstellen von dynamischen Unterklassen.
Die CWnd -Klasse stellt die Verbindung zwischen einem C++-Objekt (abgeleitet von CWnd) und ein Windows-Fenster-Objekt (auch bekannt als ein HWND).
Es gibt drei allgemeine Möglichkeiten, wie, die diese zusammenhängen:
In diesem letzten Fall erfolgt mit den Memberfunktionen:
Beide Routinen schließen ein CWnd -Objekt zu einer vorhandenen Windows- HWND. SubclassWindow nimmt das HWND direkt und SubclassDlgItem ist ein Helfer, der eine Steuerelement-ID und das übergeordnete Fenster (in der Regel ein Dialogfeld) annimmt. SubclassDlgItem dient zur Befestigung von C++-Objekten auf Dialogfeld-Steuerelemente von einem Dialogfeldvorlage erstellt.
Entnehmen Sie bitte der CTRLTEST -Beispiel für mehrere Beispiele zum SubclassWindow und SubclassDlgItem verwenden.
Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie