【WinForm.NET开发】自定义控件

2024-01-09 09:30:56

本文内容

  1. 基控件类
  2. 创建自己的控件
  3. 用户控件
  4. 扩展控件

可使用 Windows 窗体开发和实现新的控件。 可以创建新的用户控件,通过继承来修改现有控件,或编写可自行绘制的自定义控件。 本文重点介绍各种可继承控件之间的差异,并提供有关如何为项目选择某种特定控件的信息。

1、基控件类

Control?类是 Windows 窗体控件的基类。 它提供了在 Windows 窗体应用程序中进行可视化显示所需的基础结构,并提供了以下功能:

  • 公开窗口句柄。
  • 管理消息路由。
  • 提供鼠标和键盘事件,以及许多其他用户界面事件。
  • 提供高级布局功能。
  • 包含特定于可视化显示的多个属性,如?ForeColorBackColorHeight?和?Width

由于基类提供了大量基础结构,因此开发你自己的 Windows 窗体控件相对比较简单。

2、创建自己的控件

可以创建三种类型的自定义控件:用户控件、扩展控件和自定义控件。 下表可帮助你确定应创建的控件类型:

展开表

如果出现如下情况创建以下内容
  • 你想要将多个 Windows 窗体控件的功能组合到单个可重用单元。
通过从?System.Windows.Forms.UserControl?继承来设计用户控件
  • 大部分所需功能与现有的 Windows 窗体控件相同。
  • 你不需要自定义图形用户界面,或者想为现有控件设计一个新的图形用户界面。
通过从某一特定 Windows 窗体控件继承来扩展控件
  • 你想要提供控件的自定义图形表示形式。
  • 你需要实现不能通过标准控件实现的自定义功能。
通过从?System.Windows.Forms.Control?继承来创建自定义控件

3、用户控件

用户控件是作为单个控件提供给使用者的 Windows 窗体控件的集合。 此类控件称为复合控件。 其包含的控件称为构成控件。

用户控件包含与每个包含的 Windows 窗体控件相关联的所有固有功能,允许选择性地公开和绑定它们的属性。 用户控件还提供了大量的默认键盘处理功能,用户不需要进行任何额外的开发。

例如,可以生成用户控件,以显示来自数据库的客户地址数据。 此控件将包括用于显示数据库字段的?DataGridView?控件、用于处理到数据源的绑定的?BindingSource,以及用于在记录之间移动的?BindingNavigator?控件。 可以选择性地公开数据绑定属性,还可以将整个控件打包并在不同应用程序之间重复使用。

4、扩展控件

你可以从任何现有的 Windows 窗体控件派生继承的控件。 使用此方法,你可以保留 Windows 窗体控件的所有固有功能,然后通过添加自定义属性、方法或其他功能来扩展该功能。 可以使用此选项重写基控件的绘制逻辑,然后通过更改该控件的外观来扩展其用户界面。

例如,可以创建一个由?Button?控件派生的控件,并用它来跟踪用户的单击次数。

在某些控件中,也可以通过重写基类的?OnPaint?方法为控件的图形用户界面添加自定义外观。 对于跟踪单击次数的扩展按钮,可以重写?OnPaint?方法以调用?OnPaint?的基实现,然后在?Button?控件的工作区的一角绘制单击计数。

自定义控件

创建控件的另一种方法是通过从?Control?继承,从头开始充分创建一个控件。?Control?类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供特定于控件的功能或图形界面。

相比从?UserControl?或现有 Windows 窗体控件继承来说,通过从?Control?类继承来创建控件需要花费更多心思和精力。 由于用户还需执行大量的实现,因此,控件可以具有比复合控件或扩展控件更好的灵活性,而且可以使控件完全满足自己的需要。

要实现自定义控件,必须为控件的?OnPaint?事件编写代码,它控制着控件的视觉绘制方式。 还必须为控件编写任何特定于功能的行为。 还可以重写?WndProc?方法并直接处理窗口消息。 这是创建控件的最强大的方法,但若要有效地使用此技术,需熟悉 Microsoft Win32? API。

时钟控件即是一个自定义控件,它复制模拟时钟的外观和行为。 调用自定义绘制来使指针移动,以响应来自内部?Timer?组件的?Tick?事件。

自定义设计体验

如果需要实现自定义设计时体验,可以创作自己的设计器。 对于复合控件,从?ParentControlDesigner?或?DocumentDesigner?类派生自定义设计器类。 对于扩展控件和自定义控件,从?ControlDesigner?类派生自定义设计器类。

使用?DesignerAttribute?将控件与设计器关联。

文章来源:https://blog.csdn.net/m0_51887793/article/details/135448316
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。