• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

写C#自定义控件的心得

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
使用C#也有一段时间了,但从未自已设计过自定义控件,刚刚完成了一个自定义控件的设计,觉得有一些技巧和知识,可以做一个总结.
    有些东西,从MSDN中很不容易找到,比如对一些属性的描述设定.这里可以为此做一些汇兑.
    我设计了一个平滑进度条控件,这在网上很容易找到一些现成的.不过,为了学习控件的设计,我还是自己写了一个.
    这个控件继承自UserControl类.原理很简单,就是用刷子往一定的区域里面填充颜色.
    设计控件当然要有一些属性,进度条设计中最主要的属性就是最小值,最大值及当前值.有了属性在VS设计器中也要有所反映,就需要对这个属性进行描述.
    就拿最小值这个属性来说吧.在VS设计器选中这个属性就需要有它的描述性文字以及它所属的栏目.实现这两个方面可以在属性前加上这样一行文字:
    [Description("获取或设置目前进度条范围最小值"), Category("行为")]
    这样在VS设计器中该属性就会看起来跟其它属性一样了.当然也可以将栏目的汉字换为英文,但目前我不知道行为在此中用什么英文表示,但外观是使用Appearance来表示.
    除了描述性文字及所属栏目还可以有缺省值,这是很多属性都有的.加上DefaultValue(object value), 就可以应用缺省值了.
    在VS的属性设计器中,经常有这样的属性,比如字体,点击后会出现一个字体编辑器,对于此类在VS设计器中存在的编辑器,我们可以直接使用它.
    比如编辑一个字体属性.
    [Description("用于显示控件中文本的字体"), Category("Appearance")]
    public override Font Font
    {
     get { return m_LabelFont; }
     set
     {
      m_LabelFont = value;
      this.Invalidate();
     }
    }
    定义了它的返回值为Font,这样在VS设计器中,就会出现与别的控件字体一样的字体编辑器.与此类似的还有Color属性,BorderStyle属性等.
    既然这个控件继承自UserControl类,那么不可避免的会继承一些我们不想在设计器中出现的属性.比如TabStop属性,我们不希望它应用在进度条身上,就必须要让它在设计器中不可见.
    [Browsable(false)]
    public new bool TabStop
    {
     get { return base.TabStop;}
    }
    Browsable(bool value)语句可以使某个属性可见或是隐藏.
    有些继承的属性需要重写,不管是对它进行一定的改变操作还是要隐藏它.重写时需要使用override或是new,有的父类属性中使用的是virtual,但有些没有.没有使用virtual的属性,在子类中就要使用new来修饰了.
    对于事件,继承来的也有一些是不必要的,要隐藏事件,我也找了一些资料,在网上可不多见,只是在MSDN中费了半天劲才找到一句相关的语句.
    比如对于按键操作进度条也是不需要,就需要在设计器中隐藏该事件.
    [Browsable(false)]
    public new event EventHandler KeyDown;//www.elivn.com
    前面是隐藏语句,后面是事件,这样做起来,比属性成员要简单一些吧. :) 只是在网络中搜索了半天也没有发现与此相关的东西.
    对此绘图部分的操作,详细的就不在这里说了.这里只是说一些建立控件的基本东西.但是绘图的操作主要放在一起,比如放在Paint事件中.在事件的尾部再执行一下边框的绘制.
    当对进度条的当前值进行赋值操作时,需要在进度条内部触发一个绘图的操作,可以让Paint事件被触发.这里就需要执行一个方法Invalidate(),这个方法宣布当前区域为无效,然后触发Paint事件.
    进度条的区域比较小,所以不太耗费图形资源,但如果需要的图形资源比较大,且绘图操作触发频繁,就不能宣布所有区域为无效,只要宣布已经更新的区域为无效.在取得更新区域后,使用Invalidate(Rectangle rect)方法,可以只更新部分区域.
    对于图形控件,很多操作都需要使用Graphics类绘图,对这个庞大的类,我没有深入的研究,也不能在此多说,不然会说个没完. ;)
    对于进度条类,也有一些描述,比如给它一个图标,一个缺省的属性.在这个类中我仍然使用了.net中进度条的图标.
    [ToolboxBitmap(typeof(ProgressBar)), DefaultProperty("Value")]
    在VS设计器中加入平滑进度条之后,在工具面板中出现的进度条图标将是一个我们熟悉的进度条图标.当然,我们也可以使用地址路径或资源中的图标来代替它.
    相对的语句为:ToolboxBitmap(路径)

    对于控件的设计,我刚刚才开始涉及,很多东西没有发现.望有研究的同仁给予赞助.谢谢. 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#备份数据库发布时间:2022-07-13
下一篇:
C#中的==和equals()有什么区别?发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap