具有内置所有者描述支持的控件

Windows 窗体中的所有者描述(也称为自定义绘图)是一种更改特定控件的可视外观的技术。

注意

本主题中的“控件”一词用于表示派生自 ControlComponent 的类。

通常,Windows 通过使用属性设置(例如 BackColor)来自动处理绘制过程,从而确定控件外观。 使用所有者描述,可接管绘制进程,更改无法使用属性更改的外观元素。 例如,许多控件都允许设置文本的显示颜色,但仅限于一种颜色。 通过所有者描述,可执行诸如用黑色和红色分别显示部分文本等操作。

实际上,所有者描述类似于在窗体上绘制图形。 例如,可在处理程序中对窗体的 Paint 事件使用图形方法来模拟 ListBox 控件,但必须编写自己的代码才能处理所有用户交互。 借助所有者描述,该控件可使用代码来绘制其内容,但仍保留其所有固有功能。 可使用图形方法绘制控件中的每一项,或在每一项的其他方面使用默认外观时自定义每一项的某些方面。

Windows 窗体控件中的所有者描述

若要在支持所有者描述的控件中执行此功能,通常需设置一个属性并处理一个或多个事件。

支持所有者描述的大多数控件都具有 OwnerDrawDrawMode 属性,用于指示控件对自身进行绘制时是否引发其绘制相关事件。

不具有 OwnerDrawDrawMode 属性的控件包括 DataGridView 控件(提供自动发生的绘制事件)和 ToolStrip 事件(使用具有其自身绘制相关事件的外部呈现类绘制而成)。

有许多不同类型的绘制事件,但通常发生的典型绘制事件是在控件中绘制单个项。 事件处理程序接收一个 EventArgs 对象,其中包含与要绘制的项以及可用于绘制该项的工具有关的信息。 例如,此对象通常包含其父集合中的项索引号、一个指示该项的显示边界的 Rectangle 和一个用于调用绘制方法的 Graphics 对象。 对于某些事件,EventArgs 对象提供有关项和方法的附加信息,默认情况下可调用这些方法来绘制该项的某些方面,例如背景和聚焦框。

若要创建包含所有者描述的自定义项的可重用控件,请创建一个派生自控件类(支持所有者描述)的新类。 不需要对绘制事件进行处理,只需在新类中包含所有者描述代码,并替代相应的 OnEventName 方法。 在这种情况下,务必调用基类 OnEventName 方法,以便使用该控件的用户能够处理所有者描述事件并提供其他自定义内容。

以下 Windows 窗体控件在所有版本的 .NET Framework 中都支持所有者描述:

以下控件仅在 .NET Framework 2.0 中支持所有者描述:

以下控件支持所有者描述且是 .NET Framework 2.0 中的新增功能:

以下各节进一步详述了以上每个控件。

ListBox 和 ComboBox 控件

使用 ListBoxComboBox 控件可绘制控件中的各个项,这些项可以采用相同大小,也可以采用不同大小。

注意

虽然 CheckedListBox 控件派生自 ListBox 控件,但它不支持所有者描述。

若要以相同大小绘制每个项,请将 DrawMode 属性设置为 OwnerDrawFixed,并处理 DrawItem 事件。

若要使用不同的大小绘制每个项,请将 DrawMode 属性设置为 OwnerDrawVariable,并处理 MeasureItemDrawItem 事件。 使用 MeasureItem 事件可在项发生 DrawItem 事件之前指示该项的大小。

有关详细信息(包括代码示例),请参阅以下主题:

MenuItem 组件表示 MainMenuContextMenu 组件中的单个菜单项。

若要绘制 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 属性设置为 Details 时绘制控件中的每个子项或列标题,请处理 DrawSubItemDrawColumnHeader 事件。

有关详细信息(包括代码示例),请参阅以下参考主题:

TreeView 控件

使用 TreeView 控件可绘制控件中的各个节点。

若要仅绘制每个节点中显示的文本,请将 DrawMode 属性设置为 OwnerDrawText,并处理 DrawNode 事件以绘制文本。

若要绘制每个节点的所有元素,请将 DrawMode 属性设置为 OwnerDrawAll,并处理 DrawNode 事件以绘制所需的所有元素,例如文本、图标、复选框、加号和减号以及连接节点的线条。

有关详细信息(包括代码示例),请参阅以下参考主题:

DataGridView 控件

使用 DataGridView 控件可绘制控件中的各个单元格和行。

若要绘制各个单元格,请处理 CellPainting 事件。

若要绘制各个行或行的元素,请择一/同时处理 RowPrePaintRowPostPaint 事件。 RowPrePaint 事件发生在绘制行中的单元格之前,RowPostPaint 事件发生在绘制单元格之后。 可同时处理这两个事件和 CellPainting 事件以分别绘制行背景、各个单元格和行前景,或者可在需要的位置提供特定自定义内容并对行中的其他元素使用默认显示。

有关详细信息(包括代码示例),请参阅以下主题:

ToolStrip 控件

使用 ToolStrip 控件及其派生控件可自定义控件外观的任何方面。

若要为 ToolStrip 控件提供自定义呈现,请将 ToolStripToolStripManagerToolStripPanelToolStripContentPanelRenderer 属性设置为 ToolStripRenderer 对象,并处理 ToolStripRenderer 类提供的众多绘制事件中的一个或多个事件。 或者,将 Renderer 属性设置为自己的类(派生自 ToolStripRendererToolStripProfessionalRendererToolStripSystemRenderer)的一个实例,该实例会实现或替代特定 OnEventName 方法

有关详细信息(包括代码示例),请参阅以下主题:

另请参阅