[Winform控件编程系列之二]扩展一个Button控件

扩展一个Button控件

     在前篇博客[Winform控件编程系列之一]制作一个能验证错误的文本框和ErrorProvider的复合控件中我想尽我的最大能力写好,但愿望总是美好的,现实总是不尽如人意。写完后,我不得不再次进行修改。修改部分的目的是实现控件的键盘操作。

     控件编程的目的是什么?我认为主要的目的是复用、协作。

     控件编程的方法是什么?就像是编写一个类,暴露出一组属性或者方法、行为等与使用者进行交互,隐藏一些你认为应隐藏的属性等。

     Winform中经常会使用到“确定”、“取消”这样的Button,既然如此,我们就定制一个Button控件,因此这次的例子很简单。

     在开始新例子之前,先介绍一个ToolboxBitmap特性。ToolboxBitmap特性可以使你创建的自定义控件具有自定义的图标,使你摆脱那个蓝色的齿轮。

     以下四篇文章已经将自定义控件工具箱图标问题说得非常清楚了,我也不再赘述。

     1、 在Visual Basic 2005中如何将自定义工具箱图标添加到 Windows 窗体控件中 (文章标题略作修改)

     2、如何得到 visual studio 工具箱自带的图标

     3、.Net自定义控件之ToolboxBitmap元数据的设置

     4、ToolboxBitmapAttribute 构造函数

   总结:共有四种方法设置自定义控件的工具箱图标,使用ToolboxBitmap特性的三种。

     1、 文章2提到的方法可以不使用ToolboxBitmap特性。

     2、首先你应准备一个16×16的24bit的位图文件,最好按照文章2提供的方法创建。

     3、除了使用文件的绝对路径([System.Drawing.ToolboxBitmap("c:\\stop.bmp")])以外,其余方法都要求设置位图文件的“生成操作”为“嵌入的资源”。

     4、周耀帅园友的建议值得接受:推荐使用第三种构造函数[System.Drawing.ToolboxBitmap(typeof(自定义控件的类名), "文件目录名.位图文件名.bmp")]。

     定制一个Button控件的例子

      第一步:新建一个windows窗体控件库项目,命名为OkAndCancelButton。修改UserControl1.cs为OkButton.cs,并修改类继承自Button,注释掉OkButton.Designer.cs文件中的语句this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;。同样的方法再添加一个控件命名为CancelButton。

      第二步:添加一个资源文件,命名为ImagesResource.resx。添加两个24×24大小的图片文件到资源文件里。项目中新建一个目录命名为Icon,添加两个16×16的24bit位图文件到该目录里,这两个位图分别为OkButton和CancelButton控件的控件箱图标。

     第三步:定制控件的外观。在类的构造函数中的InitializeComponent();之后添加自定义的一些要求,我需要添加一个图片,因此如下所示:
            this.Image = OkAndCancelButton.ImagesResource .OkButton_24;
            this.Padding = new Padding(10, 0, 6, 0);
            this.ImageAlign = ContentAlignment.MiddleLeft;
            this.TextAlign = ContentAlignment.MiddleRight;
            this.Size = new Size(110, 35);  

    第四步:在进行第四步之前,不得不说一下关于Text属性的重写。

         英文MSDN上关于Control.Text属性对继承者的说明原文是:When overriding the Text property in a derived class,use the base class's Text property to extend the base implementation.Otherwise, you must provide all the implementation.You are not required to override both the get and set accessors of the Text property;you can override only one if needed.

         中文MSDN的翻译:不需要同时重写 Text 属性的 get 和 set 访问器;如果需要,可以只重写其中一个访问器。

         根据MSDN的翻译,我理解为可以同时重写get和set访问器,但这却不行。
         因此,我认为翻译为“不能要求同时重写Text属性的get和set访问器,根据你的需要,只能重写其中的一个。”比较恰当,忘各位高手可以指正。

        第四步就是重写Text属性,让控件拖拽到设计器中时,有默认的Text值“确定(O)"。语句如下:

         public override string Text
        {
            get
            {
                return m_Text;
            }
        }

       第五步(可选步骤):也许你对上述扩展的控件仍然不满意。好吧,再给它加点功能:多准备几组不同风格的图片,让使用者根据自己的喜好更换图片。

       1、准备几组不同风格的图片,本示例使用两组不同风格的图片。

       2、定义一个枚举:

                ///图片风格枚举
                public  enum PictureStyle
               {
                      Mellowm,  //圆润风格
                      Novel     //新颖风格
                }

       3、添加一个私有字段和公共属性:

        private PictureStyle m_ImageStyle = PictureStyle.Mellowm;
        /// <summary>
        /// 选择图片风格
        /// </summary>
        [Browsable(true),Category("Appearance"),Description("选择图片风格")]
        public PictureStyle ImageStyle
        {
            get { return m_ImageStyle; }
            set
            {
                m_ImageStyle = value;
                switch (value)
                {
                    case PictureStyle.Mellowm:
                        this.Image = OkAndCancelButton.ImagesResource.OkButton_24;
                        break;
                    case PictureStyle.Novel:
                        this.Image = OkAndCancelButton.ImagesResource.ok24;
                        break;
                }
            }
        }

       4、注释掉语句 :this.Image = OkAndCancelButton.ImagesResource .OkButton_24;
           再在其下面添加新语句:this.ImageStyle = PictureStyle.Mellowm;

       第六步:编译:

       第七步:测试:效果如下

                      工具箱图:

                         属性窗口图

                        两种不同风格Button在设计器中图

     OkButton.cs的源代码:

 

 

posted on 2012-09-30 22:18  水光  阅读(2996)  评论(4编辑  收藏  举报

导航