在 Windows 窗体中,所有者绘图(也称为自定义绘图)是一种用于改变某些控件视觉外观的技术。
通常,Windows 通过使用属性设置(例如 BackColor)自动处理绘图,以确定控件的外观。 在使用所有者绘图时,你将掌控绘制过程,能够更改无法通过属性更改的外观元素。 例如,许多控件允许你设置显示的文本的颜色,但仅限于单个颜色。 用户绘图让你可以将部分文本显示为黑色,而另一部分显示为红色。
实际上,自定义绘图类似于在窗体上绘制图形。 例如,可以使用处理程序中的图形方法来模拟ListBox
控件Paint,但必须编写自己的代码来处理所有用户交互。 使用所有者绘图时,控件使用您的代码来绘制其内容,但依然保留其所有本身的能力。 可以使用图形方法在控件中绘制每个项或自定义每个项的某些方面,同时对每个项的其他方面使用默认外观。
Windows 窗体控件中的所有者绘图
若要在支持它的控件中执行所有者绘图,通常会设置一个属性并处理一个或多个事件。
支持所有者绘图的大多数控件都有一个 OwnerDraw
或 DrawMode
属性,指示控件在绘制自身时是否会引发与绘图相关的事件或事件。
没有 OwnerDraw
或 DrawMode
属性的控件包括 DataGridView
控件,该控件提供自动发生的绘图事件,以及 ToolStrip
使用具有自身绘图相关事件的外部呈现类绘制的控件。
有许多不同类型的绘图事件,但典型的绘图事件是为了在控件中绘制单个项而发生的。 事件处理程序接收一个 EventArgs
对象,该对象包含有关要绘制的项的信息以及可用于绘制它的工具。 例如,此对象通常在其父集合中包含项的索引号、指示 Rectangle 项的显示边界和 Graphics 用于调用画图方法的对象。 对于某些事件,该 EventArgs
对象提供有关项目和方法的其他信息,你可以默认调用这些项来绘制项目的某些方面,例如背景或焦点矩形。
若要创建包含所有者绘制自定义项的可重用控件,请创建一个新类,该类派生自支持所有者绘图的控件类。 与处理绘图事件相比,请在新类中相应的 On
EventName 方法或方法的重写中包含所有者绘图代码。 在这种情况下,请确保调用基类 On
EventName 方法或方法,以便控件的用户可以处理所有者绘图事件并提供其他自定义。
以下 Windows 窗体控件支持所有版本的 .NET Framework 中的所有者绘图:
以下控件仅支持 .NET Framework 2.0 中的所有者绘图:
以下控件支持所有者绘图,并且是 .NET Framework 2.0 中的新增功能:
以下部分提供了每个控件的其他详细信息。
ListBox 和 ComboBox 控件
ListBox 和 ComboBox 控件使您能够在控件中绘制单个项,可以是统一大小或不同大小。
注释
虽然控件 CheckedListBox 派生自 ListBox 控件,但它不支持所有者绘图。
若要绘制每个项的大小相同,请将 DrawMode
属性设置为 OwnerDrawFixed,并处理 DrawItem
事件。
若要使用不同的大小绘制每个项,请将 DrawMode
属性设置为 OwnerDrawVariable 并处理 MeasureItem
和 DrawItem
事件。 该 MeasureItem
事件允许你在该项的 DrawItem
事件发生之前指示其大小。
有关详细信息,包括代码示例,请参阅以下主题:
MenuItem 组件
MenuItem 组件表示 MainMenu 或 ContextMenu 组件中的一个单独菜单项。
要绘制MenuItem,请将其OwnerDraw
属性设置为true
并处理其DrawItem
事件。 要在 DrawItem
事件发生之前自定义菜单项的大小,请处理该项的 MeasureItem
事件。
有关详细信息,包括代码示例,请参阅以下参考主题:
TabControl 控件
通过该 TabControl 控件,可以在控件中绘制单个选项卡。 所有者绘图仅影响选项卡,TabPage 的内容不受影响。
为了绘制每个 TabControl 中的选项卡,请将 DrawMode
属性设置为 OwnerDrawFixed 并处理 DrawItem
事件。 仅当选项卡在控件中可见时,才会为每个选项卡发生一次此事件。
有关详细信息,包括代码示例,请参阅以下参考主题:
ToolTip 组件
该 ToolTip 组件使你可以在显示整个工具提示时绘制它。
若要绘制 ToolTip,请将其 OwnerDraw
属性设置为 true
,并处理 Draw
事件。 为在Draw
事件发生之前自定义ToolTip的大小,请处理Popup
事件并在事件处理程序中设置ToolTipSize属性。
有关详细信息,包括代码示例,请参阅以下参考主题:
ListView 控件
通过 ListView 该控件,可以在控件中绘制单个项、子项和列标题。
若要在控件中启用所有者绘图,请将 OwnerDraw
属性设置为 true
。
若要绘制控件中的每个项,请处理 DrawItem
事件。
若要在控件中设置属性时View绘制控件中的每个子项或列标题,请处理DrawSubItem
和DrawColumnHeader
事件。Details
有关详细信息,包括代码示例,请参阅以下参考主题:
TreeView 控件
通过 TreeView 该控件,可以在控件中绘制单个节点。
若要仅绘制每个节点中显示的文本,请将 DrawMode
属性设置为 OwnerDrawText 并处理 DrawNode
要绘制文本的事件。
若要绘制每个节点的所有元素,请将 DrawMode
该属性 OwnerDrawAll 设置为并处理 DrawNode
事件以绘制所需的元素,如文本、图标、复选框以及加号和减号以及连接节点的线条。
有关详细信息,包括代码示例,请参阅以下参考主题:
DataGridView 控件
该 DataGridView 控件使你能够绘制控件中的单个单元格和行。
若要绘制单个单元格,请处理 CellPainting
事件。
若要绘制行的单个行或元素,请处理一个或两个 RowPrePaint
行和 RowPostPaint
事件。 在 RowPrePaint
绘制行中的单元格之前发生该事件,并在 RowPostPaint
绘制单元格后发生该事件。 可以处理事件和 CellPainting
事件来分别绘制行背景、单个单元格和行前景,也可以提供所需的特定自定义项,并为行的其他元素使用默认显示。
有关详细信息,包括代码示例,请参阅以下主题:
ToolStrip 控件
ToolStrip 和派生控件允许您自定义其外观的各个方面。
若要为ToolStrip控件提供自定义呈现,请将ToolStrip、ToolStripManager、ToolStripPanel或ToolStripContentPanel的Renderer
属性设置为ToolStripRenderer
对象,并处理ToolStripRenderer
类提供的一个或多个绘图事件。 或者,将Renderer
属性设置为从ToolStripRenderer
、ToolStripProfessionalRenderer或ToolStripSystemRenderer派生的你自己类的实例,该实例实现或重写了特定的On
EventName方法。
有关详细信息,包括代码示例,请参阅以下主题: