C#控件开发 【入门篇】

    xiaoxiao2025-08-26  67

    C#控件开发 【入门篇】 标签: c#gdi+winform.netstring扩展 19544人阅读 评论(5) 收藏 举报 本文章已收录于: 分类: C#开发(37) 作者同类文章 X

           C#控件的出现,让界面UI的操作的重用得到很大的提高,对开发效率的提高很有积极的意义,但是很多时候.net frame自带的控件和第三方控件都难以满足我们自己的开发需求,这个时候我们可以使用.net的自定义控件,来开发属于自己的控件。甚至可以加入VS   的工具箱,像使用自带控件一样,随心所欲的拖动得到自己的要求。

          要开发C#控件,首先就需要了解什么是控件,控件实现的基本原理是什么,然后根据这些原则,我们进行若干个控件的开发实践,我们就可以进行自己的控件开发。

     

    首先、什么是控件?

          控件其实是一组从System.Winddows.Controls或者其子类继承得来暴露给用户一些字段或者方法,可以直接通过拖拉来被重用的类库。(以上概念是我根据自己的理解总结的,如果有不准确的地方,欢迎大家拍砖)。

          从控件的定义,我们得到需要从Controls或者其子类继承来开发控件。在.net的开发中自己开发的WinForm控件通常有三种类型:复合控件(Composite Controls),扩展控件(Extended Controls),自定义控件(Custom Controls)。

          复合控件:将现有的各种控件组合起来,形成一个新的控件,将集中控件的功能集中起来。       扩展控件:在现有控件的控件的基础上派生出一个新的控件,为原有控件增加新的功能或者修改原有控件的控能。       自定义控件:直接从System.Windows.Forms.Control类派生出来。Control类提供控件所需要的所有基本功能,包括键盘和鼠标的事件处理。自定义控件是最灵活最强大的方法,但是对开发者的要求也比较高,你必须为Control类的OnPaint事件写代码。所以至少你需要了解和学习GDI+的使用,通过GDI简单学习资料,你可以下载到一份简单的GDI+学习资料,可以带领你入门,更高级的C#GDI+编程你可以查阅相关的资料。

     

    其次、控件实现的原理。

           在这系列文章中,我们主要讲解UI窗体控件,而这一些的控件的基本原理都是暴露一些属性、方法和事件给用户,然后用户通过这一系列的属性、方法和事件来达到和控件之间的交互,而控件通过OnPaint(PaintEventArgs e)方法的执行,把结果通过GDI+或者其他行为,展示在窗体(控件)上。

          通过控件的实现原理,我们知道我们要使用控件开发,则需要实现一些公开的方法、事件、属性,并且实现OnPaint方法。

     

    根据对控件和控件原理的理解,我们来做一个简单的小控件。来从代码的级别来理解下控件的实现。

    意图:我们做一个类似Label的控件,可以实现通过Text的设置,来显示出来这些文字:

    首先我们来新建一个控件类库:

    在选择了Windows窗体控件库以后,默认会带有一个用户控件,因为我们要开发的是一个自定义控件,所以可以把这个文件删掉。

     

    在打开的文件中我们鼠标点击右键,选择查看代码:因为本代码非常简单,所以就不啰嗦了,带注释贴在上面:

     

    [c-sharp] view plain copy print ? using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Text;  using System.Windows.Forms;    namespace NewLabel  {      public partial class NewLabel : Control      {          public NewLabel()          {              InitializeComponent();          }          private string _text = "";          private Graphics g;            [Description("内容"),Category("Appearance")]          public new string Text          {              get { return _text; }              set { _text = value; }          }                    protected override void OnPaint(PaintEventArgs pe)          {              base.OnPaint(pe);              g = this.CreateGraphics();              g.DrawString(_text, this.Font, new SolidBrush(Color.Black), new PointF(0, 0));          }          public void Dispose(){              g.Dispose();          }      }  }   using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace NewLabel { public partial class NewLabel : Control { public NewLabel() { InitializeComponent(); } private string _text = ""; private Graphics g; [Description("内容"),Category("Appearance")] public new string Text { get { return _text; } set { _text = value; } } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); g = this.CreateGraphics(); g.DrawString(_text, this.Font, new SolidBrush(Color.Black), new PointF(0, 0)); } public void Dispose(){ g.Dispose(); } } }

    以上代码在vs 2008中实现。

     

    咱们可以通过编译后,来添加一个测试项目。

     

          

     

    即可测试咱们想要的效果。

     

     

     

    如果你在看这篇文章的话,说明你是一个技术。那么你一定不愿意错过这篇文章,欢迎去看看

    http://blog.csdn.net/aofengdaxia/archive/2010/10/15/5944193.aspx

     

    顶 0 踩 0     上一篇C# 自定义控件(二) 新闻控件的优化下一篇伊朗承认:境内企业大面积遭遇武器级电脑病毒

    我的同类文章

    转载请注明原文地址: https://ju.6miu.com/read-1301991.html
    最新回复(0)