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 类继承:

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

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

相关文章
|
25天前
|
人工智能
阿里云CN域名收费价格2026年最新整理,CN域名注册、续费、转入和赎回费用整理
阿里云2026年CN域名最新资费:英文.cn注册38元/年,续费42元/年;中文.cn注册99元/年;转入同注册价;赎回高达1200元。享“互联网上的中国标识”等专属口令优惠,详情见万网官网。
239 1
|
存储 自然语言处理 数据可视化
Dataset:数据集集合(NLP方向数据集)——常见的自然语言处理数据集大集合(建议收藏,持续更新)
Dataset:数据集集合(NLP方向数据集)——常见的自然语言处理数据集大集合(建议收藏,持续更新)
|
机器学习/深度学习 人工智能 TensorFlow
ModelScope使用之模型部署
ModelScope是阿里巴巴打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!本文演示如何将模型部署到阿里云的EAS,对外提供服务。
16983 0
ModelScope使用之模型部署
|
SQL 监控 关系型数据库
Influx Sql系列教程九:query数据查询基本篇二
前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持
969 0
|
Linux C++ Windows
Notepad--国产开源编辑器,横空出世!
作为一个来自中国的、支持windows/linux/mac、绿色免费的、开源的文本编辑器,目标是要替换notepad++。该项目是采用了C++进行开发,针对NotePad++中比较受欢迎的诸多功能与特点进行了分析和吸收,逐渐在项目中加以实现。
6426 0
Notepad--国产开源编辑器,横空出世!
|
边缘计算 缓存 Kubernetes
阿里云云边一体容器架构创新论文被云计算顶会 ACM SoCC 录用
此次论文入选 ACM SoCC,是阿里云在云原生容器技术领域,拓展服务边界,实现云边协同的又一次创新。
34220 2
阿里云云边一体容器架构创新论文被云计算顶会 ACM SoCC 录用
|
前端开发 定位技术 开发工具
Jetpack MVVM 错误用法(二)在 launchWhenX 中启动协程
Jetpack MVVM 使用常见错误 :在 launchWhenX 中启动协程可能会隐藏隐患,应该用 repeatOnLifecycle 替代
784 0
|
传感器 存储 芯片
STM32第一课:STM硬件实物图+功能简介
STM32第一课:STM硬件实物图+功能简介
1202 0
STM32第一课:STM硬件实物图+功能简介
|
移动开发 弹性计算 前端开发
手把手教你开发互动游戏,看 EVA 互动技术体系在金币小镇的实践
EVA 是一套上手快、开发效率高、能力完善的互动研发体系,广泛应用在淘系的互动业务中。
手把手教你开发互动游戏,看 EVA 互动技术体系在金币小镇的实践
|
JSON Java API
XIPC 一个Android通用的IPC(进程通信)框架。
XIPC 一个Android通用的IPC(进程通信)框架。
909 0
XIPC 一个Android通用的IPC(进程通信)框架。