window form 自定义控件类型
所谓的控件(Control)就是对数据和方法的封装。一般来说,控件都有自己的属性、 方法和事件。控件的属性是存储控件数据的容器,控件的方法则是实现控件所需的功能。为 了提高开发的效率和界面的标准化,很多软件公司都有一套自己封装的 UI 控件,内部员工 (程序员)大部分时间都是在使用这些控件,很少有机会来开发这些自定义控件。 控件的设计和开发是一项比较繁重的工作,同时对程序员的要求也比较高,需要掌握 GDI+编程、事件模型、Windows API 和面向对象开发等知识。一个使用比较方便的控件, 其背后往往是大量的代码。虽然开发自定义控件是一个比较复杂的过程,但也是一个一劳永 逸的过程。开发控件的最大意义在于封装重复的工作,其次是可以扩充现有控件的功能。 另外,和控件概念容易混淆的是组件(Component)。一般来说,控件是具有用户界面 的可视化的组件。例如窗体中的文本框、列表框。而组件一般用户逻辑处理,比如实现数据 绑定、逻辑计算和计时触发等功能。
控件的类型 以 Windows Forms 控件来说,控件通常有三种类型:
复合控件(Composite Controls) 复合控件将现有的各种控件组合起来,形成一个新的控件,将多个控件的功能集中起来。
扩展控件(Extended Controls) 扩展控件是在现有控件的控件的基础上派生出一个新的控件,为原有控件增加新的功能 或者修改原有控件的功能。
自定义控件(Custom Controls) 自定义控件直接从 System.Windows.Forms.Control 类派生出来。Control 类提 供控件所需要的所有基本功能,包括键盘和鼠标的事件处理。自定义控件是最灵活最强大的自定义控件开发方法,但是对开发者的要求也比较高,你必须为 Control 类的 OnPaint 事件写代码,你也 可以重写 Control 类的 WndProc 方法,处理更底层的 Windows 消息,所以你必须掌握一 定的 GDI+和 Windows API 知识。 后面的章节将重点介绍 GDI+相关知识,并用案例分别 讲解如何自定义控件。Custom Controls 自定义控件称为自绘制控件(Own-Drawing Controls)比较合适。
自定义控件是一个广泛的概念,包含上面的三种控件类型。
控件的继承. 一般来说,控件的开发不是从零开始的,而是根据需要实现的控件功能,来选择合适的 控件类型,再根据控件类型来继承相关的类来实现,这样可以大大降低开发控件的难度和成 本。 继承 Windows 窗体控件 自定义控件可以继承自任何现有的 Windows 窗体控件,此方法可以保留 Windows 窗 体控件所有已有的功能和属性,控件开发人员只需要添加自定义的属性、方法或其他功能扩 展即可。例如,如果现在需要自定义一个只接受数值型的数值文本框,那么开发此数值文本 框可以创建一个从 TextBox 派生的控件,并为此控件添加一个验证输入是否为数值的判断 方法,每当文本框中的文本发生更改时就会调用此方法,另外如果需要定制数值文本框的外 观,可以通过重写基类 TextBox 的 OnPaint 方法将自定义外观添加到此控件上。
继承 UserControl 用户控件(UserControl)是封装在公共容器内的 Windows 窗体控件的集合。此容 器包含与每个 Windows 窗体控件相关联的所有固有功能,允许控件开发人员有选择地公开 和绑定内部的属性。例如,如果现在需要开发一个 IP 文本框控件,只允许输入 IP 地址。那 么开发此IP控件可以通过继承用户控件,然后在用户控件上添加4个TextBox,在TextBox 中间放入一个 Label(设置其 Text 为.的符号),再通过检测每个文本框的文本变更时用户21 第二章 控件基础 21 输入字符的合法性,即用户输入的字符只允许为 0~255。 一般来说,如果要将若干个 Windows 窗体控件的功能合成一个可重新使用的单元,则 建议从 UserControl 类继承。
继承 Control 创建一个新的控件,除了上面介绍的继承自现有窗体控件和用户控件类以外,也可以通 过继承 Control 类从头开发一个控件。Control 类提供控件(例如事件)所需的所有基 本功能,但不提供控件特定的功能或图形界面。与通过从用户控件或现有 Windows 窗体控 件继承创建控件相比,通过从 Control 类继承创建控件需要耗费更多的心思和精力。因为 控件开发人员必须为控件的 OnPaint 事件编写代码以及所需的任何功能特定代码,但同时 也允许控件开发人员根据自己的需要,灵活地自定义调整控件。例如,如果需要开发一个时 钟控件,此控件模拟时钟的外观和操作,通过添加 Timer 组件,并响应内部计时器组件的 Tick 事件来每秒调用自定义绘图方法来模拟时钟指针运动。
评论