Window Form 控件基础

在开始正式介绍如何开发自定义控件之前,有必要先了解一下控件开发的基础知识。下面从控件的概念、分类和开发模式上对控件做一个基本的概述。

1 控件的概念


所谓的控件就是对数据和方法的封装。一般来说,控件都有自己的属性、方法和事件。控件的属性是存储控件数据的容器。控件的方法则是实现控件所需的功能。为了提高开发的效率和界面的标准化,一般的软件公司都有一套自己封装的 UI 控件,很多程序员都是在使用这些控件,很少有机会来开发这些自定义控件。控件的设计和开发是一项比较繁重的工作,同时对程序员的要求也比较高,需要掌握 GDI+编程、事件模型、Window API 和面向对象开发等知识。一个使用比较方便的控件,其背后往往是大量的代码。虽然开发自定义控件是一个比较复杂的过程,但也是一个一劳永逸的过程。开发控件的最大意义在于封装重复的工作,其次是可以扩充现有控件的功能。

另外,和控件(Control)概念容易混淆的是是组件(Component)。一般来说,控件是具有用户界面的可视化的组件。例如窗体中的文本框、列表框。而组件一般用户逻辑处理,比如实现计算和性能采集等功能。

2 控件的类型


以 WinForm 控件来说,控件通常有三种类型:

  • 复合控件(Composite Controls)

复合控件将现有的各种控件组合起来,形成一个新的控件,将集中控件的功能集中起来。

  • 扩展控件(Extended Controls)

扩展控件在现有控件的控件的基础上派生出一个新的控件,为原有控件增加新的功能或者修改原有控件的控能。

  • 自定义控件(Custom Controls)

自定义控件直接从 System.Windows.Forms.Control 类派生出来。Control 类提供控件所需要的所有基本功能,包括键盘和鼠标的事件处理。自定义控件是最灵活最强大的方法,但是对开发者的要求也比较高,你必须为 Control 类的 OnPaint 事件写代码,你也可以重写 Control 类的 WndProc 方法,处理更底层的 Windows 消息,所以你必须掌握一定的 GDI+和Windows API 知识。

3 控件的继承


一般来说,控件的开发不是从零开始的,而是根据需要实现的控件的功能,通过继承相关的类来实现的,这样可以大大降低开发控件的难度和成本。

  • 继承 Windows 窗体控件

自定义控件可以继承自任何现有的 Windows 窗体控件,此方法可以保留 Windows 窗体控件所有已有的功能和属性,控件开发人员只需要添加自定义的属性、方法或其他功能扩展即可。例如,如果现在需要自定义一个只接受数值型的数值文本框,那么开发此数值文本框可以创建一个从 TextBox 派生的控件,并为此控件添加一个验证输入是否为数值的判断方法,每当文本框中的文本发生更改时就会调用此方法,另外如果需要定制数值文本框的外观,可以通过重写基类 TextBox 的 OnPaint 方法将自定义外观添加到此控件上。

一般来说,处于下列情况时建议从 Windows 窗体控件继承:

大多数所需的功能已经与现有的 Windows 窗体控件相同

不需要自定义图形接口,或者想为现有控件设计一个新的外观

  • 继承 UserControl

用户控件(UserControl)是封装在公共容器内的 Windows 窗体控件的集合。此容器包含与每个 Windows 窗体控件相关联的所有固有功能,允许控件开发人员有选择地公开和绑定内部的属性。例如,如果现在需要开发一个 IP 文本框控件,只允许输入 IP 地址。那么开发此IP控件可以通过继承用户控件,然后在用户控件上添加4个TextBox,在TextBox

中间放入一个 Label(设置其 Text 为.的符号),在通过每个文本框的文本变更时刻检测用户输入的字符只允许为 0~255 即可。

一般来说,如果要将若干个 Windows 窗体控件的功能合成一个可重新使用的单元,则建议从 UserControl 类继承。

  • 继承 Control

创建一个新的控件,除了上面介绍的继承自现有窗体控件和用户控件类以外,也可以通 过继承 Control 类从头开发一个控件。Control 类提供控件(例如事件)所需的所有基本功能,但不提供控件特定的功能或图形界面。与通过从用户控件或现有 Windows 窗体控件继承创建控件相比,通过从 Control 类继承创建控件需要耗费更多的心思和精力。因为控件开发人员必须为控件的 OnPaint 事件编写代码以及所需的任何功能特定代码,但同时也允许控件开发人员根据自己的需要,灵活地自定义调整控件。例如,如果需要开发一个时钟控件,此控件模拟时钟的外观和操作,通过添加 Timer 组件,并响应内部计时器组件的Tick 事件来每秒调用自定义绘图方法来模拟时钟指针运动。

一般来说,处于下列情况时建议从 Control 类继承:

想要提供控件的自定义图形化表示形式。

需要实现无法从标准控件获得的自定义功能。

上一篇:loadFileSystems error & ExceptionUtils错误原因分析


下一篇:Visual Studio Code搭建C++开发环境