C# 自定義控件入門


原文地址:http://www.itdaan.com/blog/2008/03/29/95500785fa538b3900b34ee824376e8b.html

這幾天為了什么"評估",搞得莫名的緊張,現在評估組走了,反而開始覺得有點無聊了.
  為了完善仿Windows的畫板,做了一個很原始的顏色抬取控件.現在將大致的過程介紹下.大家也可以直接下載工程文件.  
  平台:VS 2005 WINFORM
  語言:C#
  最終效果圖:

2008329159.jpg


  光看看圖片似乎說明不了什么問題,還是接着往下看吧!
  
  要想在VS 2005 winform 中編輯自定義控件,步驟如下:
  1.點擊文件->新建項目->選擇Windows控件庫
  2.編輯控件
  3.點擊生成->生成 項目名稱 ,完成這一步后會在bin或debug目錄下看到"項目名稱.dll"文件,這個便是你的控件庫了
  4.在需要使用該控件的程序中點擊工具->選擇工具項->瀏覽->選擇剛才的那個.dll文件,這樣你便會在你的工具箱中找到你的那個控件
  
  今天要寫的主要是第二個步驟,其它的大家自己去掌握.
  新建一個項目后會得到如右圖所示的界面: 2008329241.jpg
  首先我們對這個自定義控件取個名字:ColorHatch;
  接下來我們對這個界面進行布局修改成和效果圖類似的界面.
  然后就開始對代碼進行編輯了.
  分析1:我們需要一個panel1來顯示我們所選擇的顏色 2008329249.jpg;同時我們希望可以在調用控件的程序中直接對其初始顏色進行設置;
  那么現在我們就來實現分析1中的要求:
  這里主要的問題就是如何來給我們的這個控件定義一個外部屬性,以至我們可以在屬性設計視圖中對其進行設置.
  定義屬性的方法是首先聲明一個private 變量 private Color hatchColor;
  然后我們編寫set與get方法,也就是對應的屬性賦值與取值的方法
  

     [Description( " 設置當前顏色 " )]  // 顯示在屬性設計視圖中的描述
        [DefaultValue( typeof (Color),  " Black " )] // 給予初始值
         public  Color HatchColor
         {
            get return hatchColor; }
            set
            {
                hatchColor = value;
                panel1.BackColor = value;
            }
        }

  這樣我們的這個外部屬性就做好了.這個效果只能在調用這個控件的窗體中才能查看.
  
  分析2:當調用該控件的窗體運行時,我們希望能有一個方法將所選中的顏色傳遞給所調用的窗體;我們可以聯想下其它控件是如何與主窗體傳遞信息的(不是通過屬性就是事件),我們這里肯定是要在選擇某種顏色后便將顏色傳遞給主窗體,所以我們要采用事件來進行處理.
  因為控件本身並不提供此事件,所以我們自然是要自己定義一個事件.
  關於"事件",詳細講起來就差不多可以專門寫一片了.我們這里只是簡單介紹下如何自己定義事件,大家可以去網上查查資料,記得陳廣的c#語言參考視頻中就有講到.
  編寫事件的主要步驟如下:
  1.創建一個委托(關於委托這里不做介紹)2.聲明一個事件 3.定義一個觸發事件的方法
  
  現在我們就來寫一下這個事件:

public   delegate   void  ColorChangedEventHandler( object  sender, ColorChangedEventArgs e); // 事件所需的委托

         // 當顏色改變時觸發事件
         public   event  ColorChangedEventHandler ColorChanged; // 定義一個ColorChanged事件

         protected   virtual   void  OnColorChanged(ColorChangedEventArgs e)
         {//事件觸發方法
            if (ColorChanged != null)
            {//判斷事件是否為空
                ColorChanged(this, e);//觸發事件
            }
        }


  ColorChanged(this,e)其實是使用委托調用一個事件處理方法,這個事件處理方法就是我們雙擊事件時自動生成的一個方法.就好像我們雙擊click時,便會自動生成一個private panel1_click(object sender,EventArgs e).

  但是單單寫完這些我們還無法在調用方找到這個事件,因為我們現在只是完成了一個事件,還沒有和我們的控件進行關聯.我們必須在控件需要調用這個事件的地方,加上事件觸發方法.我們要知道使用這個事件的前提是panel1中的顏色被改變,也就是說在我們選取了新的顏色時觸發此方法,如下:

private   void  panel_Click( object  sender, EventArgs e)
         {
            Panel p = sender as Panel;
            if (p != null)
            {
                hatchColor = p.BackColor;
                panel1.BackColor = hatchColor;
                OnColorChanged(new ColorChangedEventArgs(hatchColor));//因為顏色改變所以觸發事件
            }
        }


  加了以上這步后,我們就可以在調用這個控件的窗體的事件中找到這個自定義事件了.這樣我們就可以像使用一般事件一樣,雙擊進行事件處理方法的編寫了.

  這時有些朋友可能會問ColorChangedEventArgs是什么了?這個東西是不是很眼熟?是不是和EventArgs很像?我們在click事件中可以經常碰見.EventArgs是用戶傳入的參數,我們這個ColorChangedEventArgs就是繼承自這個EventArgs的一個類,目的是用來傳遞我們選中的顏色給調用方.
  
  下面我們來看一下這個ColorChangedEventArgs類

public   class  ColorChangedEventArgs : EventArgs
     {
        private Color color;

        /// <summary>
        /// 顏色改變事件數據
        /// </summary>
        /// <param name="c">改變后的顏色</param>
        public ColorChangedEventArgs(Color c)
        {
            color = c;
        }

        /// <summary>
        /// 獲取顏色
        /// </summary>
        public Color GetColor
        {
            get return color; }
        }

    }


  這樣一個自定義控件的主要問題就已經解決了,可能有的朋友看得比較暈,所以建議先去了解一下.NET中的事件. 
  
  最后我們來看下在調用這個控件的窗體中的效果:
2008329346.jpg


整個工程文件


免責聲明!

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



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