[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的源代碼:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM