欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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方法,这个方法主要是用来绘制控件的样式的,控件的外观就是通过这个方法绘制的。