Steuerelemente mit integrierter Ownerdrawing-Unterstützung
Ownerdrawing in Windows Forms, das auch als benutzerdefiniertes Zeichnen bezeichnet wird, ist eine Technik, mit der die visuelle Darstellung bestimmter Steuerelemente geändert wird.
Tipp
Mit dem Begriff "Steuerelement" werden in diesem Thema Klassen bezeichnet, die entweder von Control oder von Component abgeleitet werden.
Normalerweise werden Zeichnungsoperationen in Windows automatisch verarbeitet, indem Eigenschafteneinstellungen wie BackColor verwendet werden, um die Darstellung eines Steuerelements zu bestimmen. Beim Ownerdrawing übernehmen Sie das Zeichnen und können Darstellungselemente ändern, die nicht mithilfe von Eigenschaften angepasst werden können. Beispielsweise kann bei zahlreichen Steuerelementen die Farbe des angezeigten Textes festgelegt werden, dabei ist die Anzeige jedoch auf eine Farbe beschränkt. Das Ownerdrawing bietet beispielsweise die Möglichkeit, einen Teil des Textes in Schwarz und den anderen in Rot anzuzeigen.
In der Praxis ist das Ownerdrawing mit dem Zeichnen von Grafiken in einem Formular vergleichbar. Beispielsweise können Sie Grafikmethoden in einem Handler für das Paint-Ereignis des Formulars verwenden, um ein ListBox-Steuerelement zu emulieren. Zur Behandlung der gesamten Benutzerinteraktion müssten Sie jedoch eigenen Code schreiben. Beim Ownerdrawing verwendet das Steuerelement den von Ihnen geschriebenen Code, um den Inhalt zu zeichnen, behält im Übrigen aber seine gesamte systeminterne Funktionalität bei. Sie können Grafikmethoden zum Zeichnen der einzelnen Elemente im Steuerelement oder zum Anpassen einiger Aspekte einzelner Elemente verwenden, während für andere Aspekte einzelner Elemente wiederum die Standarddarstellung übernommen werden kann.
Ownerdrawing in Windows Forms-Steuerelementen
Um Ownerdrawing in Steuerelementen auszuführen, die diese Art des Zeichnens unterstützen, legen Sie normalerweise eine Eigenschaft fest und behandeln mindestens ein Ereignis.
Die meisten Steuerelemente mit Ownerdrawing-Unterstützung verfügen über die OwnerDraw-Eigenschaft oder die DrawMode-Eigenschaft, die angibt, ob das Steuerelement eines oder mehrere zeichnungsbezogene Ereignisse auslöst, sobald es gezeichnet wird.
Zu den Steuerelementen, die keine OwnerDraw-Eigenschaft oder DrawMode-Eigenschaft aufweisen, gehört das DataGridView-Steuerelement, das automatisch ausgelöste Zeichnungsereignisse bereitstellt, sowie das ToolStrip-Steuerelement, das unter Verwendung einer externen Renderklasse gezeichnet wird, die eigene zeichnungsbezogene Ereignisse aufweist.
Es stehen viele verschiedene Arten von Zeichnungsereignissen zur Verfügung, ein typisches Zeichnungsereignis tritt jedoch auf, wenn ein einzelnes Element innerhalb eines Steuerelements gezeichnet werden soll. Der Ereignishandler empfängt ein EventArgs-Objekt mit Informationen zum gezeichneten Element sowie zu den Tools, die zum Zeichnen verwendet werden können. Dieses Objekt enthält üblicherweise die Indexnummer des Elements innerhalb seiner übergeordneten Auflistung, ein Rectangle, das die Begrenzung des Anzeigebereichs für das Element angibt, sowie ein Graphics-Objekt zum Aufrufen von Zeichnungsmethoden. Bei einigen Ereignissen umfasst das EventArgs-Objekt zusätzliche Informationen zum Element sowie zu den Methoden, die aufgerufen werden können, um einige Aspekte des Elements in der Standarddarstellung zu zeichnen, z. B. den Hintergrund oder ein Fokusrechteck.
Zum Erstellen eines wiederverwendbaren Steuerelements, das Ownerdrawing-Anpassungen enthält, erstellen Sie eine neue Klasse, die von einer Steuerelementklasse mit Ownerdrawing-Unterstützung abgeleitet ist. Anstatt Zeichnungsereignisse zu behandeln, sollten Sie Ownerdrawing-Code in Überschreibungen für mindestens eine geeignete OnEventName-Methode in der neuen Klasse einfügen. Stellen Sie in diesem Fall sicher, dass die OnEventName-Methoden der Basisklasse aufgerufen werden, damit Benutzer des Steuerelements Ownerdrawing-Ereignisse behandeln und weitere Anpassungen vornehmen können.
Die folgenden Windows Forms-Steuerelemente unterstützen Ownerdrawing in allen Versionen von .NET Framework:
MenuItem (von MainMenu und ContextMenu verwendet)
Die folgenden Steuerelemente unterstützen Ownerdrawing nur in .NET Framework, Version 2.0:
Die folgenden Steuerelemente unterstützen Ownerdrawing und sind in .NET Framework, Version 2.0 neu:
Die folgenden Abschnitte enthalten zusätzliche Details zu jedem dieser Steuerelemente.
ListBox-Steuerelement und Kombinationsfeld-Steuerelement
Das ListBox-Steuerelement und das ComboBox-Steuerelement bieten die Möglichkeit, einzelne Elemente im Steuerelement entweder in derselben oder in verschiedenen Größen zu zeichnen.
Tipp
Obwohl das CheckedListBox-Steuerelement vom ListBox-Steuerelement abgeleitet wird, bietet es keine Ownerdrawing-Unterstützung.
Um alle Elemente in derselben Größe zu zeichnen, legen Sie die DrawMode-Eigenschaft auf OwnerDrawFixed fest und behandeln das DrawItem-Ereignis.
Um alle Elemente in unterschiedlichen Größen zu zeichnen, legen Sie die DrawMode-Eigenschaft auf OwnerDrawVariable fest und behandeln sowohl das MeasureItem-Ereignis als auch das DrawItem-Ereignis. Mit dem MeasureItem-Ereignis können Sie die Größe eines Elements angeben, bevor das DrawItem-Element für das jeweilige Element auftritt.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Themen:
MenuItem-Komponente
Die MenuItem-Komponente stellt ein einzelnes Menüelement in einer MainMenu-Komponente oder ContextMenu-Komponente dar.
Um MenuItem zu zeichnen, legen Sie die zugehörige OwnerDraw-Eigenschaft auf true fest und behandeln das zugehörige DrawItem-Ereignis. Um die Größe des Menüelements anzupassen, bevor das DrawItem-Ereignis auftritt, behandeln Sie das MeasureItem-Ereignis des Elements.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Referenzthemen:
TabControl-Steuerelement
Das TabControl-Steuerelement ermöglicht es Ihnen, einzelne Registerkarten im Steuerelement zu zeichnen. Ownerdrawing wirkt sich nur auf die Registerkarten aus, der Inhalt von TabPage wird nicht beeinflusst.
Um jede Registerkarte in einem TabControl zu zeichnen, legen Sie die DrawMode-Eigenschaft auf OwnerDrawFixed fest und behandeln das DrawItem-Ereignis. Dieses Ereignis tritt jeweils einmal für jede Registerkarte auf, jedoch nur dann, wenn die Registerkarte im Steuerelement sichtbar ist.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Referenzthemen:
ToolTip-Komponente
Die ToolTip-Komponente ermöglicht es Ihnen, die gesamte QuickInfo zu zeichnen, wenn diese angezeigt wird.
Um ToolTip zu zeichnen, legen Sie die zugehörige OwnerDraw-Eigenschaft auf true fest und behandeln das zugehörige Draw-Ereignis. Um die Größe von ToolTip anzupassen, bevor das Draw-Ereignis auftritt, behandeln Sie das Popup-Ereignis und legen die ToolTipSize-Eigenschaft im Ereignishandler fest.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Referenzthemen:
ListView-Steuerelement
Das ListView-Steuerelement ermöglicht es Ihnen, einzelne Elemente, Unterelemente und Spaltenheader im Steuerelement zu zeichnen.
Um das Ownerdrawing im Steuerelement zu aktivieren, legen Sie die OwnerDraw-Eigenschaft auf true fest.
Um jedes Element im Steuerelement zu zeichnen, behandeln Sie das DrawItem-Ereignis.
Um jedes Unterelement oder jeden Spaltenheader in Steuerelement zu zeichnen, wenn die View-Eigenschaft auf Details festgelegt ist, behandeln Sie das DrawSubItem-Ereignis und das DrawColumnHeader-Ereignis.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Referenzthemen:
TreeView-Steuerelement
Das TreeView-Steuerelement ermöglicht es Ihnen, einzelne Knoten im Steuerelement zu zeichnen.
Um nur den in den einzelnen Knoten angezeigten Text zu zeichnen, legen Sie die DrawMode-Eigenschaft auf OwnerDrawText fest und behandeln das DrawNode-Ereignis zum Zeichnen des Textes.
Um alle Elemente jedes Knotens zu zeichnen, legen Sie die DrawMode-Eigenschaft auf OwnerDrawAll fest und behandeln das DrawNode-Ereignis zum Zeichnen des jeweils gewünschten Elements, z. B. Text, Symbole, Kontrollkästchen, Plus- und Minuszeichen sowie Verbindungslinien zwischen den Knoten.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Referenzthemen:
DataGridView-Steuerelement
Das DataGridView-Steuerelement ermöglicht es Ihnen, einzelne Zellen und Zeilen im Steuerelement zu zeichnen.
Um einzelne Zellen zu zeichnen, behandeln Sie das CellPainting-Ereignis.
Um einzelne Zeilen oder Zeilenelemente zu zeichnen, behandeln Sie das RowPrePaint-Ereignis und/oder das RowPostPaint-Ereignis. Das RowPrePaint-Ereignis tritt vor dem Zeichnen der Zellen in einer Zeile und das RowPostPaint-Ereignis danach auf. Sie können beide Ereignisse und das CellPainting-Ereignis behandeln, um den Zeilenhintergrund, einzelne Zellen sowie den Zeilenvordergrund separat zu zeichnen. Alternativ können Sie für bestimmte Elemente spezielle Anpassungen bereitstellen und für die übrigen Zeilenelemente die Standarddarstellung verwenden.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Themen:
Gewusst wie: Anpassen der Darstellung von Zellen im DataGridView-Steuerelement von Windows Forms
Gewusst wie: Anpassen der Darstellung von Zeilen im DataGridView-Steuerelement in Windows Forms
ToolStrip-Steuerelement
ToolStrip und abgeleitete Steuerelemente ermöglichen es Ihnen, beliebige Aspekte der Steuerelementdarstellung anzupassen.
Um ToolStrip-Steuerelemente benutzerdefiniert rendern zu lassen, legen Sie die Renderer-Eigenschaft von ToolStrip, ToolStripManager, ToolStripPanel oder ToolStripContentPanel auf ein ToolStripRenderer-Objekt fest und behandeln eines oder mehrere der zahlreichen Zeichnungsereignisse, die von der ToolStripRenderer-Klasse bereitgestellt werden. Alternativ legen Sie eine Renderer-Eigenschaft auf eine Instanz Ihrer eigenen, von ToolStripRenderer, ToolStripProfessionalRenderer oder ToolStripSystemRenderer abgeleiteten Klasse fest, die bestimmte OnEventName-Methoden implementiert oder überschreibt.
Weitere Informationen, einschließlich Codebeispiele, finden Sie unter den folgenden Themen: