Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Abschnitt enthält allgemeine Informationen zu benutzerdefinierten Zeichenfunktionen und bietet eine konzeptionelle Übersicht darüber, wie eine Anwendung benutzerdefiniertes Zeichnen unterstützen kann. Derzeit unterstützen die folgenden Steuerelemente benutzerdefinierte Draw-Funktionen:
- Kopfzeilensteuerelemente
- Listenansichtssteuerelemente
- Steuerelemente für die Erneute Leiste
- Symbolleisten-Steuerelemente
- QuickInfo-Steuerelemente
- Trackbar-Steuerelemente
- Strukturansichtssteuerelemente
Informationen zu benutzerdefinierten Zeichnungsbenachrichtigungen
Alle gängigen Steuerelemente, die benutzerdefinierte Draw-Sende-NM_CUSTOMDRAW Benachrichtigungscodes an bestimmten Punkten während des Zeichnungsvorgangs unterstützen. Diese Benachrichtigungscodes beschreiben Zeichnungsvorgänge, die für das gesamte Steuerelement gelten, sowie Zeichnungsvorgänge, die für Elemente innerhalb des Steuerelements spezifisch sind. Wie viele Benachrichtigungscodes werden NM_CUSTOMDRAW Benachrichtigungen als WM_NOTIFY Nachrichten gesendet.
Der lParam-Parameter einer benutzerdefinierten Draw-Benachrichtigung ist die Adresse einer NMCUSTOMDRAW-Struktur oder einer steuerelementspezifischen Struktur, die eine NMCUSTOMDRAW-Struktur als erstes Element enthält. In der folgenden Tabelle wird die Beziehung zwischen den Steuerelementen und den verwendeten Strukturen veranschaulicht.
| Struktur | Verwendet von |
|---|---|
| NMCUSTOMDRAW- | Steuerelemente für Leiste, Trackleiste und Kopfzeile |
| NMLVCUSTOMDRAW | Listenansichtssteuerelemente |
| NMTBCUSTOMDRAW | Symbolleisten-Steuerelemente |
| NMTTCUSTOMDRAW | QuickInfo-Steuerelemente |
| NMTVCUSTOMDRAW | Strukturansichtssteuerelemente |
Zeichnen von Zyklen, Zeichenphasen und Benachrichtigungen
Wie alle Windows-Anwendungen zeichnen sich häufig verwendete Steuerelemente regelmäßig basierend auf nachrichten, die vom System oder anderen Anwendungen empfangen wurden, und löschen sie sie selbst. Der Prozess eines Steuerelementmals oder Löschvorgangs selbst wird als Farbzyklus bezeichnet. Steuerelemente, die benutzerdefinierte Draw-Benachrichtigungscodes unterstützen, senden NM_CUSTOMDRAW Benachrichtigungscodes in regelmäßigen Abständen durch jeden Farbzyklus. Dieser Benachrichtigungscode wird von einer NMCUSTOMDRAW-Struktur oder einer anderen Struktur begleitet, die eine NMCUSTOMDRAW-Struktur als erstes Element enthält.
Ein Teil der Informationen, die die NMCUSTOMDRAW-Struktur enthält, ist die aktuelle Phase des Lackzyklus. Dies wird als Zeichenstufe bezeichnet und wird durch den Wert im dwDrawStage-Element der Struktur dargestellt. Ein Steuerelement informiert sein übergeordnetes Element über vier grundlegende Zeichenphasen. Diese grundlegenden oder globalen Zeichenphasen werden in der Struktur durch die folgenden Flagwerte dargestellt (definiert in Commctrl.h).
| Globale Zeichnungsstufenwerte | BESCHREIBUNG |
|---|---|
| CDDS_PREPAINT | Bevor der Farbzyklus beginnt. |
| CDDS_POSTPAINT | Nach Abschluss des Farbzyklus. |
| CDDS_PREERASE | Bevor der Radierzyklus beginnt. |
| CDDS_POSTERASE | Nach Abschluss des Radierzyklus. |
Jeder der vorstehenden Werte kann mit dem CDDS_ITEM Flag kombiniert werden, um zeichnungsspezifische Phasen für Elemente anzugeben. Aus Gründen der Einfachheit 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 Steuerelementversionen 4.71. Flag in Kombination 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 er tun muss. Weitere Informationen zu diesen Rückgabewerten finden Sie in den folgenden Abschnitten.
Nutzen von benutzerdefinierten Draw Services
Der Schlüssel zum Nutzen der benutzerdefinierten Draw-Funktionalitä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 Rückgabewerte für Benachrichtigungen verwenden kann, um das Verhalten des Steuerelements zu bestimmen.
Die Details sind in die folgenden Themen unterteilt:
- Reagieren auf die vorbemalte Benachrichtigung
- Anfordern von elementspezifischen Benachrichtigungen
- Zeichnen des Elements selbst
- Ändern von Schriftarten und Farben
Reagieren auf die vorbemalte Benachrichtigung
Am Anfang jedes Malzyklus sendet das Steuerelement den NM_CUSTOMDRAW Benachrichtigungscode und gibt den CDDS_PREPAINT Wert im dwDrawStage-Element der zugehörigen NM_CUSTOMDRAW Struktur an. Der Wert, den Ihre Anwendung an diese erste Benachrichtigung zurückgibt, bestimmt, wie und wann das Steuerelement nachfolgende benutzerdefinierte Zeichnungsbenachrichtigungen für den Rest dieses Zeichenzyklus sendet. Ihre Anwendung kann als Reaktion auf die erste Benachrichtigung eine Kombination der folgenden Flags zurückgeben.
| Rückgabewert | Effekt |
|---|---|
| CDRF_DODEFAULT | Das Steuerelement zeichnet sich selbst. Für diesen Farbzyklus werden keine zusätzlichen NM_CUSTOMDRAW Benachrichtigungen gesendet. Dieses Kennzeichen kann nicht mit einem anderen Flag 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 CDDS_ITEMPREPAINT ist. |
| CDRF_NOTIFYITEMDRAW | Das Steuerelement benachrichtigt das übergeordnete Element aller elementspezifischen Zeichnungsvorgänge. Sie sendet NM_CUSTOMDRAW Benachrichtigungscodes vor und nach dem Zeichnet von Elementen. Dies tritt auf, wenn dwDrawStage CDDS_PREPAINT ist. |
| CDRF_NOTIFYPOSTERASE | Das Steuerelement benachrichtigt das übergeordnete Element nach dem Löschen eines Elements. Dies tritt auf, wenn dwDrawStage CDDS_PREPAINT ist. |
| CDRF_NOTIFYPOSTPAINT | Das Steuerelement sendet eine NM_CUSTOMDRAW Benachrichtigung, wenn der Lackierzyklus für das gesamte Steuerelement abgeschlossen ist. Dies tritt auf, wenn dwDrawStage CDDS_PREPAINT ist. |
| CDRF_NOTIFYSUBITEMDRAW | Version 4.71. Ihre Anwendung erhält eine NM_CUSTOMDRAW Benachrichtigung mit dwDrawStage auf CDDS_ITEMPREPAINT | CDDS_SUBITEM, bevor jedes Listenansicht-Unterelement gezeichnet wird. Anschließend können Sie die Schriftart und Farbe für jedes Unterelement separat angeben oder CDRF_DODEFAULT für die Standardverarbeitung zurückgeben. Dies tritt auf, wenn dwDrawStage CDDS_ITEMPREPAINT ist. |
| CDRF_SKIPDEFAULT | Ihre Anwendung hat das Element manuell gezeichnet. Das Steuerelement zeichnet das Element nicht. Dies tritt auf, wenn dwDrawStage CDDS_ITEMPREPAINT ist. |
| CDRF_SKIPPOSTPAINT | Das Steuerelement zeichnet das Fokusrechteck nicht um ein Element. |
Anfordern von elementspezifischen Benachrichtigungen
Wenn Ihre Anwendung CDRF_NOTIFYITEMDRAW an die anfängliche benutzerdefinierte Zeichnungsbenachrichtigung zurückgibt, sendet das Steuerelement Benachrichtigungen für jedes Element, das es während dieses Zeichenzyklus zeichnet. Diese elementspezifischen Benachrichtigungen weisen den CDDS_ITEMPREPAINT Wert im dwDrawStage-Element der zugehörigen NMCUSTOMDRAW-Struktur auf. 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 mit dem Zeichnen des nächsten Elements beginnt.
Zeichnen des Elements selbst
Wenn Die 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 in den Gerätekontext aus, der durch das hdc-Element der NMCUSTOMDRAW-Struktur angegeben ist, die der benutzerdefinierten Draw-Benachrichtigung 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 Funktion 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. Mit benutzerdefiniertem Zeichnen können Sie die Schriftartattribute für ausgewählte Elemente nicht ändern.
Wenn Sie Textfarben für alle Steuerelemente ändern möchten, 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. Zum Ändern der Textfarben in der Listen- oder Strukturansicht müssen Sie die gewünschten Farbwerte in den ClrText - und clrTextBk-Elementen der NMLVCUSTOMDRAW - oder NMTVCUSTOMDRAW-Struktur platzieren.
Hinweis
Vor Version 6.0 der allgemeinen Steuerelemente ignorieren Symbolleisten das CDRF_NEWFONT Flag. Version 6.0 unterstützt das CDRF_NEWFONT Flag, 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 eine visuelle Formatvorlage aktiv ist. Um die Farbe einer Symbolleiste in Version 6.0 zu ändern, müssen Sie zuerst visuelle Formatvorlagen deaktivieren, indem Sie SetWindowTheme aufrufen und keine visuelle Formatvorlage angeben:
SetWindowTheme (hwnd, "", "");
Benutzerdefiniertes Zeichnen mit steuerelementen List-View und Tree-View
Die häufigsten Steuerelemente können im Wesentlichen auf die gleiche Weise behandelt werden. Die Steuerelemente "Listenansicht" und "Strukturansicht" verfügen jedoch über einige Features, die einen etwas anderen Ansatz zum benutzerdefinierten Zeichnen erfordern.
Bei Version 5.0 können diese beiden Steuerelemente beschnittenen Text anzeigen, 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 Listen- oder Strukturansicht-Steuerelements ä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.
Benutzerdefiniertes Zeichnen mit List-View-Steuerelementen
Da Listenansichtssteuerelemente Unterelemente und mehrere Anzeigemodi aufweisen, müssen Sie die NM_CUSTOMDRAW Benachrichtigung etwas anders behandeln als für die anderen allgemeinen Steuerelemente.
Verwenden Sie für den Berichtsmodus das folgende Verfahren.
- Die erste NM_CUSTOMDRAW Benachrichtigung verfügt über das dwDrawStage-Mitglied der zugeordneten NMCUSTOMDRAW-Struktur , die auf CDDS_PREPAINT festgelegt ist. Gibt CDRF_NOTIFYITEMDRAW zurück.
- 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.
- Wenn Sie im vorherigen Schritt CDRF_NOTIFYSUBITEMDRAW zurückgegeben haben, erhalten Sie dann eine NM_CUSTOMDRAW Benachrichtigung für jedes Unterelement, für das dwDrawStage auf CDDS_SUBITEM festgelegt ist | CDDS_ITEMPREPAINT. Wenn Sie die Schriftart oder Farbe für dieses Unterelement ändern möchten, geben Sie eine neue Schriftart oder Farbe an, und geben Sie CDRF_NEWFONT zurück.
Verwenden Sie für die Modi "Große Symbole", "kleines Symbol" und "Listen" das folgende Verfahren.
- Die erste NM_CUSTOMDRAW Benachrichtigung verfügt über das dwDrawStage-Mitglied der zugeordneten NMCUSTOMDRAW-Struktur , die auf CDDS_PREPAINT festgelegt ist. Gibt CDRF_NOTIFYITEMDRAW zurück.
- 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 haben, erhalten Sie keine zusätzlichen NM_CUSTOMDRAW Benachrichtigungen.
Ein Beispiel für einen Listenansichts-NM_CUSTOMDRAW Benachrichtigungshandlers finden Sie unter Verwenden von benutzerdefiniertem Zeichnen.