在C#中創建自定義控件

在C#中創建自定義控件
創建自定義的控件有下面幾種方法:
1 創建繼承自UserControl的控件。對於這樣的控件,它其實是一個控件的容器,你可以像設計一般的窗體一樣設計它,因此,標準的控件都是可用的。當然了,如果願意,你也可以隨意地在Paint事件的處理函數中修改它的外觀。這類自定義控件可以用於把其他控件繼承起來
2 創建繼承自其他控件(例如標準控件)的控件。對於這類控件,主要是爲了修改已有控件的外觀和行爲,沒有必要從零開始。
3 創建繼承自Control的控件。可以使用的超類有 
 

它允許你從頭開始編寫一個全新的控件,當然,這種方法也是三者中最複雜的。control類提供控件(例如事件)所需的所有基本功能,但不提供控件特定的功能或圖形接口。與通過從用戶控件或現有 Windows 窗體控件繼承來創建控件相比,通過從 Control 類繼承來創建控件需要耗費的心思和精力要多得多。因爲你必須爲控件的 OnPaint 事件編寫代碼以及所需的任何功能特定代碼,但同時也允許作者根據自己的需要,靈活地自定義調整控件。
下面我們就來看看如何創建自己的控件。
確定好採用上面三者中的哪一個方法後,創建相應的工程。之後,需要添加自己的字段,事件,和屬性。如果需要重新修改超類的某個動作,可能還要重載超類對應的虛函數。如果需要自己畫控件的外觀(繼承自Control的空間必須這樣做),需要添加Paint事件的處理函數。
最後,我們再說一下如何使自己的控件可以在.net studio中的設計器中使用。
1 如果在設計器中希望自己的控件改變大小之後能夠被重畫,需要在控件類的構造函數中使用下面的代碼:SetStyle(ControlStyles.ResizeRedraw, true); 另外,如果想使控件的背景色爲透明色,也需要類似的代碼,例如:SetStyle(ControlStyles.ResizeRedraw | ControlStyles.SupportTransparentBackColor, true);
2 關於控件類的元數據。爲了使設計器能正確地操作我們的控件,必須提供足夠的關於元數據(即描述控件自身的數據)。幾個常用的元數據包括
一 關於空間的元數據。常用的是控件默認的事件,默認的屬性,控件顯示在工具箱上的圖標。所謂默認事件,是指當在設計器中雙擊空間時,要給哪個事件添加事件處理函數。所謂默認屬性,是指當我們在設計器中編輯控件的屬性時,哪個屬性默認被激活。可以在控件類的定義前添加下面的代碼指定默認事件和默認屬性:
[DefaultProperty("屬性名"),DefaultEvent("事件名"),ToolboxBitmap("路徑")]
另外,ToolboxBitmap元數據也可以是Type的實例,這樣,顯示在工具箱中的圖標就是對應控件的圖標。例如:
[ToolboxBitmap(typeof(Button))]
二 關於某個事件的元數據。主要是事件的描述信息,即在事件設計器中,當選中對應的事件時,顯示在設計器下面的描述本事件的信息。可以在事件的定義前添加下面的代碼指定默認事件和默認屬性:
[Description("你自己的描述")]
三 關於某個屬性的元數據。主要包括Category,Description,DefaultValue,Browserable和Editor,其中Category是指本屬性顯示在設計器中的哪個分類裏,Description指當在設計器中選定本屬性時,顯示在設計器下面的描述本屬性的信息。DefaultValue就不用說了吧。至於Browserable,這個元數據太重要了,它指定對應的屬性在設計器裏是否可見。若設爲false,在設計器裏就看不到此屬性了,因此最好顯式把它設成true(默認好像是false )。Editor也是一個很重要的屬性,它指定當要給此屬性選定值時,應該採用什麼編輯器。對於一般類型的屬性(例如int,string等),設計器都能給出正確的默認的編輯器,但是如果設計器無法識別屬性的類型,那麼你就必須指定編輯器(你自己寫的類,這些類繼承自System.Drawing.Desing名字空間中的幾個類,幸運的是,這個名字空間中提供了幾個可以直接使用的編輯器,使得對於像圖像、字體這樣的屬性不用自己寫編輯器了 )。可以在屬性的定義前添加代碼指定這些元數據。
下面是一個例子。
[   Category("Flash"),
    Editor(typeof(FlashTrackBarValueEditor), typeof(UITypeEditor)),
    DefaultValue(0)]

關於屬性還有一點需要注意,如果這個屬性和控件的外觀有關,那麼要在屬性的set段裏引發重畫事件,這樣才能使控件得到正確的顯示 

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