winform自定义控件开发-前言
程序员文章站
2022-03-04 11:17:56
...
最近出于美化项目UI的需求,本来想用DEVexpress的控件库。但是下载下来一看有点复杂而且还要付费。想了一下还是自己写吧!虽然之前也写过一些自定义控件,但是都是把windows现有的控件组合一下的用户控件。从Control继承的完全自己绘制的控件了解的就不是很深了。就找了一个最简单的label先来练练手。
首先,总结一下基础知识,winform的所有界面控件包括窗体控件都是派生于Control类,这是所有控件的基类。现在我们添加一个自定义控件,项目中可以看到两个文件一个设计文件和逻辑文件,我可以看到设计文件下的代码如下:
partial class FengLabel
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
我们可以看到主要有两个方法Dispose和InitializeComponent,还有一个私有字段components,我们从上往下,先来说说components,可以看到在InitializeComponent中对该字段进行了初始化,我们可以看到components的类是System.ComponentModel.Container,然后这个类是用来干嘛的咧。根据MSDN上的解释,封装零个或更多个组件。我猜这个应该是winform的界面设计的支持类。至于到底是怎么运行的我还没搞清楚,不过对自定义控件的编写没有什么影响。这个代码都是设计器自动生成的我们不要去修改它就好了。然后我们可以看到逻辑文件的代码如下:
public partial class FengLabel : Control
{
public FengLabel()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
首先我们可以看到它是继承了Control类,然后在它的构造方法里面调用了InitializeComponent方法,这个是用来初始化子控件的,在这里并没有什么用。当然这个然后可以看到这边自动给我们重写了OnPaint方法,这个方法主要是用来绘制控件的样式的,控件的外观就是通过这个方法绘制的。