可使用 Windows 窗体开发和实现新的控件。 可以创建新的用户控件,通过继承来修改现有控件,或编写可自行绘制的自定义控件。 本文重点介绍各种可继承控件之间的差异,并提供有关如何为项目选择某种特定控件的信息。
Control?类是 Windows 窗体控件的基类。 它提供了在 Windows 窗体应用程序中进行可视化显示所需的基础结构,并提供了以下功能:
由于基类提供了大量基础结构,因此开发你自己的 Windows 窗体控件相对比较简单。
可以创建三种类型的自定义控件:用户控件、扩展控件和自定义控件。 下表可帮助你确定应创建的控件类型:
展开表
如果出现如下情况 | 创建以下内容 |
---|---|
| 通过从?System.Windows.Forms.UserControl?继承来设计用户控件。 |
| 通过从某一特定 Windows 窗体控件继承来扩展控件。 |
| 通过从?System.Windows.Forms.Control?继承来创建自定义控件。 |
用户控件是作为单个控件提供给使用者的 Windows 窗体控件的集合。 此类控件称为复合控件。 其包含的控件称为构成控件。
用户控件包含与每个包含的 Windows 窗体控件相关联的所有固有功能,允许选择性地公开和绑定它们的属性。 用户控件还提供了大量的默认键盘处理功能,用户不需要进行任何额外的开发。
例如,可以生成用户控件,以显示来自数据库的客户地址数据。 此控件将包括用于显示数据库字段的?DataGridView?控件、用于处理到数据源的绑定的?BindingSource,以及用于在记录之间移动的?BindingNavigator?控件。 可以选择性地公开数据绑定属性,还可以将整个控件打包并在不同应用程序之间重复使用。
你可以从任何现有的 Windows 窗体控件派生继承的控件。 使用此方法,你可以保留 Windows 窗体控件的所有固有功能,然后通过添加自定义属性、方法或其他功能来扩展该功能。 可以使用此选项重写基控件的绘制逻辑,然后通过更改该控件的外观来扩展其用户界面。
例如,可以创建一个由?Button?控件派生的控件,并用它来跟踪用户的单击次数。
在某些控件中,也可以通过重写基类的?OnPaint?方法为控件的图形用户界面添加自定义外观。 对于跟踪单击次数的扩展按钮,可以重写?OnPaint?方法以调用?OnPaint?的基实现,然后在?Button?控件的工作区的一角绘制单击计数。
创建控件的另一种方法是通过从?Control?继承,从头开始充分创建一个控件。?Control?类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供特定于控件的功能或图形界面。
相比从?UserControl?或现有 Windows 窗体控件继承来说,通过从?Control?类继承来创建控件需要花费更多心思和精力。 由于用户还需执行大量的实现,因此,控件可以具有比复合控件或扩展控件更好的灵活性,而且可以使控件完全满足自己的需要。
要实现自定义控件,必须为控件的?OnPaint?事件编写代码,它控制着控件的视觉绘制方式。 还必须为控件编写任何特定于功能的行为。 还可以重写?WndProc?方法并直接处理窗口消息。 这是创建控件的最强大的方法,但若要有效地使用此技术,需熟悉 Microsoft Win32? API。
时钟控件即是一个自定义控件,它复制模拟时钟的外观和行为。 调用自定义绘制来使指针移动,以响应来自内部?Timer?组件的?Tick?事件。
如果需要实现自定义设计时体验,可以创作自己的设计器。 对于复合控件,从?ParentControlDesigner?或?DocumentDesigner?类派生自定义设计器类。 对于扩展控件和自定义控件,从?ControlDesigner?类派生自定义设计器类。
使用?DesignerAttribute?将控件与设计器关联。