C#编写自定义控件心得

转载 2013年12月02日 23:00:30
有些东西,从MSDN中很不容易找到,比如对一些属性的描述设定.这里可以为此做一些汇兑.

    我设计了一个平滑进度条自定义C#控件,这在网上很容易找到一些现成的.不过,为了学习自定义C#控件的设计,我还是自己写了一个.

    这个自定义C#控件继承自UserControl类.原理很简单,就是用刷子往一定的区域里面填充颜色.

    设计自定义C#控件当然要有一些属性,进度条设计中最主要的属性就是最小值,最大值及当前值.有了属性在VS设计器中也要有所反映,就需要对这个属性进行描述.

    就拿最小值这个属性来说吧.在VS设计器选中这个属性就需要有它的描述性文字以及它所属的栏目.实现这两个方面可以在属性前加上这样一行文字:

    [Description("获取或设置目前进度条范围最小值"),Category("行为")]

    这样在VS设计器中该属性就会看起来跟其它属性一样了.当然也可以将栏目的汉字换为英文,但目前我不知道行为在此中用什么英文表示,但外观是使用Appearance来表示.

    除了描述性文字及所属栏目还可以有缺省值,这是很多属性都有的.加上DefaultValue(objectvalue),就可以应用缺省值了.

    在VS的属性设计器中,经常有这样的属性,比如字体,点击后会出现一个字体编辑器,对于此类在VS设计器中存在的编辑器,我们可以直接使用它.

    比如编辑一个字体属性.

  1. [Description("用于显示控件中文本的字体"),Category("Appearance")]
  2. public override Font Font
  3. {
  4. get{return m_LabelFont;}
  5. set
  6. {
  7. m_LabelFont=value;
  8. this.Invalidate();
  9. }
  10. }
    定义了它的返回值为Font,这样在VS设计器中,就会出现与别的控件字体一样的字体编辑器.与此类似的还有Color属性,BorderStyle属性等.

    既然这个控件继承自UserControl类,那么不可避免的会继承一些我们不想在设计器中出现的属性.比如TabStop属性,我们不希望它应用在进度条身上,就必须要让它在设计器中不可见.

  1. [Browsable(false)]
  2. public new bool TabStop
  3. {
  4. get{return base.TabStop;}
  5. }
    Browsable(bool value)语句可以使某个属性可见或是隐藏.

    有些继承的属性需要重写,不管是对它进行一定的改变操作还是要隐藏它.重写时需要使用override或是new,有的父类属性中使用的是virtual,但有些没有.没有使用virtual的属性,在子类中就要使用new来修饰了.

    对于事件,继承来的也有一些是不必要的,要隐藏事件,我也找了一些资料,在网上可不多见,只是在MSDN中费了半天劲才找到一句相关的语句.

    比如对于按键操作进度条也是不需要,就需要在设计器中隐藏该事件.

  1. [Browsable(false)]
  2. public new event EventHandler KeyDown;
    前面是隐藏语句,后面是事件,这样做起来,比属性成员要简单一些吧.:)只是在网络中搜索了半天也没有发现与此相关的东西.

    对此绘图部分的操作,详细的就不在这里说了.这里只是说一些建立控件的基本东西.但是绘图的操作主要放在一起,比如放在Paint事件中.在事件的尾部再执行一下边框的绘制.

    当对进度条的当前值进行赋值操作时,需要在进度条内部触发一个绘图的操作,可以让Paint事件被触发.这里就需要执行一个方法Invalidate(),这个方法宣布当前区域为无效,然后触发Paint事件.

    进度条的区域比较小,所以不太耗费图形资源,但如果需要的图形资源比较大,且绘图操作触发频繁,就不能宣布所有区域为无效,只要宣布已经更新的区域为无效.在取得更新区域后,使用Invalidate(Rectanglerect)方法,可以只更新部分区域.

    对于图形自定义C#控件,很多操作都需要使用Graphics类绘图,对这个庞大的类,我没有深入的研究,也不能在此多说,不然会说个没完.;)

    对于进度条类,也有一些描述,比如给它一个图标,一个缺省的属性.在这个类中我仍然使用了.NET中进度条的图标.

  1. [ToolboxBitmap(typeof(ProgressBar)),DefaultProperty("Value")]
    在Visual Studio设计器中加入平滑进度条之后,在工具面板中出现的进度条图标将是一个我们熟悉的进度条图标.当然,我们也可以使用地址路径或资源中的图标来代替它.

   相对的语句为:ToolboxBitmap(路径)

C#开发之自定义控件的简单使用

1.开发自定义控件 自定义控件在开发中算常用的技术,因为在解决实际问题时往往.NET Framework提供的控件不能满足所有的需求,还好可以根据.NET Framework提供的基础控件组合扩展成...
  • whuarui2010
  • whuarui2010
  • 2012年10月12日 10:34
  • 40834

WinForm 100个精美自定义控件

  • 2014年02月11日 10:24
  • 17.56MB
  • 下载

C自定义控件库

  • 2013年01月28日 21:36
  • 3MB
  • 下载

c# 自定义控件

第一步:新建一个控件库项目:myControl 第二步:从工具箱里面拖动1个PictureBox、1个Button、6个Lable控件到用户界面上,布局如下: 如上图,设...
  • c914620529
  • c914620529
  • 2015年08月16日 22:04
  • 785

C#自定义控件之-winform美化

对于系统自带的窗体,博主实在不敢恭维,测试时使用方便快捷,但真正项目中无法使用,只因不美观的外表,每次都很头疼窗体的美化,这里列出一些需要解决的问题和自己收集到的解决方法,如有错误请指出。 废话不多说...
  • lcj401175209
  • lcj401175209
  • 2016年10月28日 09:07
  • 5323

基于GDI+开发的自定义绘图控件WillGraph介绍

一. 前言:         我于2013年之前一直从事电动机状态监测系统软件的研发工作,之后又跳到一家石油公司做电缆地层测试解释软件和测井地面系统的研发。         在此期间,一直与自定义控件...
  • jiangxf_007
  • jiangxf_007
  • 2014年12月22日 17:34
  • 1096

自定义控件其实很简单2/3

Custom ViewandroidAndroid自定义View 尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudi...
  • puhaibo_skynet
  • puhaibo_skynet
  • 2015年02月02日 13:30
  • 528

自定义控件入门

博主刚接触自定义控件时间并不是很长,只会写一些比较简单的自定义控件,当然对自定义控件的认识也停留在初级阶段。即 onMeasure、onLayout和onDraw三个方法的理解上。当然要写出一个高效的...
  • Zc0716
  • Zc0716
  • 2016年05月08日 19:15
  • 227

C#的自定义控件

C#的UserControl让用户自定义控件容易了很多,创建WindowsFormsControlLibrary工程,自定义UserControl,生成的.dll加入到任何新工程,就能在新工程中使用自...
  • u010153703
  • u010153703
  • 2014年08月06日 22:43
  • 1820

C# 自定义异常的总结

在C#中所有的异常类型都继承自System.Exception,也就是说,System.Exception是所有异常类的基类. 总起来说,其派生类分为两种: 1. SystemExceptio...
  • younghaiqing
  • younghaiqing
  • 2017年02月14日 13:48
  • 237
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#编写自定义控件心得
举报原因:
原因补充:

(最多只允许输入30个字)