編寫自定義控件

爲了完善仿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

轉載自:http://hi.baidu.com/wytzsjzly/blog/item/e9db822fa562be321e30897e.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章