Freigeben über


Informationen zum benutzerdefinierten Zeichnen

Dieser Abschnitt enthält allgemeine Informationen zur benutzerdefinierten Zeichnungsfunktion und bietet eine konzeptionelle Übersicht darüber, wie eine Anwendung benutzerdefiniertes Zeichnen unterstützen kann. Derzeit unterstützen die folgenden Steuerelemente benutzerdefinierte Zeichnungsfunktionen:

  • Headersteuerelemente
  • Listenansichtssteuerelemente
  • Steuerelemente für die Leiste
  • Symbolleisten-Steuerelemente
  • QuickInfo-Steuerelemente
  • Trackbar-Steuerelemente
  • Strukturansichtssteuerelemente

Informationen zu benutzerdefinierten Zeichnungsbenachrichtigungen

Alle gängigen Steuerelemente, die benutzerdefiniertes Zeichnen unterstützen, senden NM_CUSTOMDRAW Benachrichtigungscodes an bestimmten Stellen während Zeichnungsvorgängen. Diese Benachrichtigungscodes beschreiben Zeichnungsvorgänge, die für das gesamte Steuerelement gelten, sowie Zeichnungsvorgänge, die speziell für Elemente innerhalb des Steuerelements gelten. Wie viele Benachrichtigungscodes werden NM_CUSTOMDRAW Benachrichtigungen als WM_NOTIFY Nachrichten gesendet.

Der lParam-Parameter einer benutzerdefinierten Zeichnungsbenachrichtigung ist die Adresse einer NMCUSTOMDRAW-Struktur oder einer steuerelementspezifischen Struktur, die eine NMCUSTOMDRAW-Struktur als erstes Element enthält. Die folgende Tabelle veranschaulicht die Beziehung zwischen den Steuerelementen und den von ihnen verwendeten Strukturen.

Struktur Verwendet von
NMCUSTOMDRAW Rebar-, Trackbar- und Headersteuerelemente
NMLVCUSTOMDRAW Listenansichtssteuerelemente
NMTBCUSTOMDRAW Symbolleisten-Steuerelemente
NMTTCUSTOMDRAW QuickInfo-Steuerelemente
NMTVCUSTOMDRAW Strukturansichtssteuerelemente

 

Malzyklen, Zeichnungsphasen und Benachrichtigungen

Wie alle Windows-Anwendungen zeichnen und löschen sich gängige Steuerelemente regelmäßig basierend auf Nachrichten, die vom System oder anderen Anwendungen empfangen werden. Der Prozess einer Kontrollmalerei oder des Löschvorgangs selbst wird als Farbzyklus bezeichnet. Steuerelemente, die benutzerdefiniertes Zeichnen unterstützen, senden NM_CUSTOMDRAW Benachrichtigungscodes in regelmäßigen Abständen über jeden Malzyklus. Dieser Benachrichtigungscode wird von einer NMCUSTOMDRAW-Struktur oder einer anderen Struktur begleitet, die als erstes Element eine NMCUSTOMDRAW-Struktur enthält.

Eine Information, die die NMCUSTOMDRAW-Struktur enthält, ist die aktuelle Phase des Lackzyklus. Dies wird als Zeichnungsphase bezeichnet und durch den Wert im dwDrawStage-Element der Struktur dargestellt. Ein Steuerelement informiert sein übergeordnetes Element über vier grundlegende Zeichnungsstufen. Diese grundlegenden oder globalen Zeichnungsphasen werden in der Struktur durch die folgenden Flagwerte (definiert in Commctrl.h) dargestellt.

Globale Zeichnungsstufenwerte BESCHREIBUNG
CDDS_PREPAINT Bevor der Lackzyklus beginnt.
CDDS_POSTPAINT Nachdem der Lackierzyklus abgeschlossen ist.
CDDS_PREERASE Bevor der Löschzyklus beginnt.
CDDS_POSTERASE Nachdem der Löschzyklus abgeschlossen ist.

 

Jeder der vorherigen Werte kann mit dem CDDS_ITEM-Flag kombiniert werden, um elementspezifische Zeichnungsphasen anzugeben. Der Einfachheit halber enthält Commctrl.h die folgenden elementspezifischen Werte.

Elementspezifische Zeichnungsstufenwerte BESCHREIBUNG
CDDS_ITEMPREPAINT Bevor ein Element gezeichnet wird.
CDDS_ITEMPOSTPAINT Nachdem ein Element gezeichnet wurde.
CDDS_ITEMPREERASE Bevor ein Element gelöscht wird.
CDDS_ITEMPOSTERASE Nachdem ein Element gelöscht wurde.
CDDS_SUBITEM Allgemeine Steuerungsversionen 4.71. Flag kombiniert mit CDDS_ITEMPREPAINT oder CDDS_ITEMPOSTPAINT, wenn ein Unterelement gezeichnet wird. Dies wird nur festgelegt, wenn CDRF_NOTIFYITEMDRAW von CDDS_PREPAINT zurückgegeben wird.

 

Ihre Anwendung muss den NM_CUSTOMDRAW Benachrichtigungscode verarbeiten und dann einen bestimmten Wert zurückgeben, der das Steuerelement darüber informiert, was es tun muss. Weitere Informationen zu diesen Rückgabewerten finden Sie in den folgenden Abschnitten.

Nutzen von benutzerdefinierten Zeichnungsdiensten

Der Schlüssel zur Nutzung der benutzerdefinierten Zeichnungsfunktionalität besteht darin, auf die NM_CUSTOMDRAW Benachrichtigungscodes zu reagieren, die ein Steuerelement sendet. Die Rückgabewerte, die Ihre Anwendung als Reaktion auf diese Benachrichtigungen sendet, bestimmen das Verhalten des Steuerelements für diesen Farbzyklus.

Dieser Abschnitt enthält Informationen dazu, wie Ihre Anwendung NM_CUSTOMDRAW Benachrichtigungsrückgabewerte verwenden kann, um das Verhalten des Steuerelements zu bestimmen.

Details sind in die folgenden Themen unterteilt:

Reagieren auf die Vorabbemalungsbenachrichtigung

Zu Beginn jedes Malzyklus sendet das Steuerelement den NM_CUSTOMDRAW Benachrichtigungscode und gibt den CDDS_PREPAINT-Wert im dwDrawStage-Member der begleitenden NM_CUSTOMDRAW Struktur an. Der Wert, den Ihre Anwendung in diese erste Benachrichtigung zurückgibt, bestimmt, wie und wann das Steuerelement nachfolgende benutzerdefinierte Zeichnungsbenachrichtigungen für den Rest dieses Farbzyklus sendet. Ihre Anwendung kann als Reaktion auf die erste Benachrichtigung eine Kombination der folgenden Flags zurückgeben.

Rückgabewert Auswirkung
CDRF_DODEFAULT Das Steuerelement zeichnet sich selbst. Für diesen Farbzyklus werden keine zusätzlichen NM_CUSTOMDRAW Benachrichtigungen gesendet. Dieses Flag kann nicht mit anderen Flags verwendet werden.
CDRF_DOERASE Das Steuerelement zeichnet nur den Hintergrund.
CDRF_NEWFONT Ihre Anwendung hat eine neue Schriftart für das Element angegeben. das Steuerelement verwendet die neue Schriftart. Weitere Informationen zum Ändern von Schriftarten finden Sie unter Ändern von Schriftarten und Farben. Dies tritt auf, wenn dwDrawStage gleich CDDS_ITEMPREPAINT.
CDRF_NOTIFYITEMDRAW Das -Steuerelement benachrichtigt das übergeordnete Element über alle elementspezifischen Zeichnungsvorgänge. Vor und nach dem Zeichnet von Elementen werden NM_CUSTOMDRAW Benachrichtigungscodes gesendet. Dies tritt auf, wenn dwDrawStage gleich CDDS_PREPAINT.
CDRF_NOTIFYPOSTERASE Das Steuerelement benachrichtigt das übergeordnete Element, nachdem ein Element entfernt wurde. Dies tritt auf, wenn dwDrawStage gleich CDDS_PREPAINT.
CDRF_NOTIFYPOSTPAINT Das Steuerelement sendet eine NM_CUSTOMDRAW Benachrichtigung, wenn der Malzyklus für das gesamte Steuerelement abgeschlossen ist. Dies tritt auf, wenn dwDrawStage gleich CDDS_PREPAINT.
CDRF_NOTIFYSUBITEMDRAW Version 4.71. Ihre Anwendung erhält eine NM_CUSTOMDRAW-Benachrichtigung , wobei dwDrawStage auf CDDS_ITEMPREPAINT | CDDS_SUBITEM, bevor jedes Listenansichtsunterelement gezeichnet wird. Anschließend können Sie Schriftart und Farbe für jedes Unterelement separat angeben oder CDRF_DODEFAULT zur Standardverarbeitung zurückgeben. Dies tritt auf, wenn dwDrawStage gleich CDDS_ITEMPREPAINT.
CDRF_SKIPDEFAULT Ihre Anwendung hat das Element manuell gezeichnet. Das -Steuerelement zeichnet das Element nicht. Dies tritt auf, wenn dwDrawStage gleich CDDS_ITEMPREPAINT.
CDRF_SKIPPOSTPAINT Das Steuerelement zeichnet das Fokusrechteck nicht um ein Element.

 

Anfordern von elementspezifischen Benachrichtigungen

Wenn Ihre Anwendung CDRF_NOTIFYITEMDRAW zur anfänglichen benutzerdefinierten Zeichnungsbenachrichtigung zurückgibt, sendet das Steuerelement Benachrichtigungen für jedes Element, das es während dieses Malzyklus zeichnet. Diese elementspezifischen Benachrichtigungen verfügen über den CDDS_ITEMPREPAINT-Wert im dwDrawStage-Member der zugehörigen NMCUSTOMDRAW-Struktur . Sie können anfordern, dass das Steuerelement eine weitere Benachrichtigung sendet, wenn das Zeichnen des Elements abgeschlossen ist, indem Sie CDRF_NOTIFYPOSTPAINT an diese elementspezifischen Benachrichtigungen zurückgeben. Andernfalls geben Sie CDRF_DODEFAULT zurück, und das Steuerelement benachrichtigt das übergeordnete Fenster erst, wenn es beginnt, das nächste Element zu zeichnen.

Zeichnen des Elements selbst

Wenn Ihre Anwendung das gesamte Element zeichnet, geben Sie CDRF_SKIPDEFAULT zurück. Dadurch kann das Steuerelement Elemente überspringen, die nicht gezeichnet werden müssen, wodurch der Systemaufwand verringert wird. Beachten Sie, dass die Rückgabe dieses Werts bedeutet, dass das Steuerelement keinen Teil des Elements zeichnet.

Ändern von Schriftarten und Farben

Ihre Anwendung kann benutzerdefiniertes Zeichnen verwenden, um die Schriftart eines Elements zu ändern. Wählen Sie einfach das gewünschte HFONT im Gerätekontext aus, der vom hdc-Member der NMCUSTOMDRAW-Struktur angegeben wird, die der benutzerdefinierten Zeichnungsbenachrichtigung zugeordnet ist. Da die ausgewählte Schriftart möglicherweise andere Metriken als die Standardschriftart aufweist, stellen Sie sicher, dass Sie das CDRF_NEWFONT Bit in den Rückgabewert für die Benachrichtigung einschließen. Weitere Informationen zur Verwendung dieser Funktionalität finden Sie im Beispielcode unter Verwenden von benutzerdefiniertem Zeichnen. Die schriftart, die ihre Anwendung angibt, wird verwendet, um dieses Element anzuzeigen, wenn es nicht ausgewählt ist. Beim benutzerdefinierten Zeichnen können Sie die Schriftartattribute für ausgewählte Elemente nicht ändern.

Zum Ändern der Textfarben für alle Steuerelemente, die benutzerdefiniertes Zeichnen mit Ausnahme der Listenansicht und der Strukturansicht unterstützen, legen Sie einfach die gewünschten Text- und Hintergrundfarben im Gerätekontext fest, der in der benutzerdefinierten Zeichnungsbenachrichtigungsstruktur mit den Funktionen SetTextColor und SetBkColor bereitgestellt wird. Um die Textfarben in der Listen- oder Strukturansicht zu ändern, müssen Sie die gewünschten Farbwerte in den Membern clrText und clrTextBk der NMLVCUSTOMDRAW - oder NMTVCUSTOMDRAW-Struktur platzieren.

Hinweis

Vor Version 6.0 der allgemeinen Steuerelemente ignorieren Symbolleisten das flag CDRF_NEWFONT . Version 6.0 unterstützt das Flag CDRF_NEWFONT , und Sie können es verwenden, um eine andere Schriftart für die Symbolleiste auszuwählen. Sie können die Farbe einer Symbolleiste jedoch nicht ändern, wenn ein visueller Stil aktiv ist. Um die Farbe einer Symbolleiste in Version 6.0 zu ändern, müssen Sie zunächst visuelle Stile deaktivieren, indem Sie SetWindowTheme aufrufen und keine visuelle Formatvorlage angeben:

 

SetWindowTheme (hwnd, "", "");

Benutzerdefiniertes Zeichnen mit List-View- und Tree-View-Steuerelementen

Die meisten gängigsten Steuerelemente können im Wesentlichen auf die gleiche Weise behandelt werden. Die Listenansicht- und Strukturansichtssteuerelemente verfügen jedoch über einige Features, die einen etwas anderen Ansatz für das benutzerdefinierte Zeichnen erfordern.

In Version 5.0 zeigen diese beiden Steuerelemente möglicherweise beschnittenen Text an, wenn Sie die Schriftart ändern, indem Sie CDRF_NEWFONT zurückgeben. Dieses Verhalten ist für die Abwärtskompatibilität mit früheren Versionen der allgemeinen Steuerelemente erforderlich. Wenn Sie die Schriftart eines Listenansichts- oder Strukturansichtssteuerelements ändern möchten, erhalten Sie bessere Ergebnisse, wenn Sie eine CCM_SETVERSION Nachricht senden, deren wParam-Wert auf 5 festgelegt ist, bevor Sie dem Steuerelement Elemente hinzufügen. Ein Beispiel für ein Strukturansicht-Steuerelement, das benutzerdefiniertes Zeichnen verwendet, finden Sie im Knowledge Base-Artikel SAMPLE: CustDTv Illustrates Custom Draw in a TreeView (Q248496).

Benutzerdefiniertes Zeichnen mit List-View-Steuerelementen

Da Listenansichtssteuerelemente Über Unterelemente und mehrere Anzeigemodi verfügen, müssen Sie die NM_CUSTOMDRAW Benachrichtigung etwas anders behandeln als bei den anderen gängigen Steuerelementen.

Führen Sie für den Berichtsmodus das folgende Verfahren aus.

  1. Für die erste NM_CUSTOMDRAW Benachrichtigung ist der dwDrawStage-Member der zugeordneten NMCUSTOMDRAW-Struktur auf CDDS_PREPAINT festgelegt. Gibt CDRF_NOTIFYITEMDRAW zurück.
  2. Anschließend erhalten Sie eine NM_CUSTOMDRAW Benachrichtigung, bei der dwDrawStage auf CDDS_ITEMPREPAINT festgelegt ist. Wenn Sie neue Schriftarten oder Farben angeben und CDRF_NEWFONT zurückgeben, werden alle Unterelemente des Elements geändert. Wenn Sie stattdessen jedes Unterelement separat behandeln möchten, geben Sie CDRF_NOTIFYSUBITEMDRAW zurück.
  3. Wenn Sie im vorherigen Schritt CDRF_NOTIFYSUBITEMDRAW zurückgegeben haben, erhalten Sie eine NM_CUSTOMDRAW Benachrichtigung für jedes Unterelement, bei dem dwDrawStage auf CDDS_SUBITEM | CDDS_ITEMPREPAINT. Um die Schriftart oder Farbe für dieses Unterelement zu ändern, geben Sie eine neue Schriftart oder Farbe an, und geben Sie CDRF_NEWFONT zurück.

Führen Sie für die Modi großes Symbol, kleines Symbol und Listen das folgende Verfahren aus.

  1. Für die erste NM_CUSTOMDRAW Benachrichtigung ist der dwDrawStage-Member der zugeordneten NMCUSTOMDRAW-Struktur auf CDDS_PREPAINT festgelegt. Gibt CDRF_NOTIFYITEMDRAW zurück.
  2. Anschließend erhalten Sie eine NM_CUSTOMDRAW Benachrichtigung, bei der dwDrawStage auf CDDS_ITEMPREPAINT festgelegt ist. Sie können die Schriftarten oder Farben eines Elements ändern, indem Sie neue Schriftarten und Farben angeben und CDRF_NEWFONT zurückgeben. Da diese Modi keine Unterelemente enthalten, erhalten Sie keine zusätzlichen NM_CUSTOMDRAW Benachrichtigungen.

Ein Beispiel für eine Listenansicht NM_CUSTOMDRAW Benachrichtigungshandler finden Sie unter Verwenden von benutzerdefiniertem Zeichnen.

Konzept

Verwenden von benutzerdefiniertem Zeichnen

Referenz zum benutzerdefinierten Zeichnen

Andere Ressourcen

SAMPLE: CustDTv Illustrates Custom Draw in a TreeView (Q248496)