在C#中創(chuàng )建自定義控件
創(chuàng )建自定義的控件有下面幾種方法:
1 創(chuàng )建繼承自UserControl的控件。對于這樣的控件,它其實(shí)是一個(gè)控件的容器,你可以像設計一般的窗體一樣設計它,因此,標準的控件都是可用的。當然了,如果愿意,你也可以隨意地在Paint事件的處理函數中修改它的外觀(guān)。這類(lèi)自定義控件可以用于把其他控件繼承起來(lái)
2 創(chuàng )建繼承自其他控件(例如標準控件)的控件。對于這類(lèi)控件,主要是為了修改已有控件的外觀(guān)和行為,沒(méi)有必要從零開(kāi)始。
3 創(chuàng )建繼承自Control的控件??梢允褂玫某?lèi)有 
它允許你從頭開(kāi)始編寫(xiě)一個(gè)全新的控件,當然,這種方法也是三者中最復雜的。control類(lèi)提供控件(例如事件)所需的所有基本功能,但不提供控件特定的功能或圖形接口。與通過(guò)從用戶(hù)控件或現有 Windows 窗體控件繼承來(lái)創(chuàng )建控件相比,通過(guò)從 Control 類(lèi)繼承來(lái)創(chuàng )建控件需要耗費的心思和精力要多得多。因為你必須為控件的 OnPaint 事件編寫(xiě)代碼以及所需的任何功能特定代碼,但同時(shí)也允許作者根據自己的需要,靈活地自定義調整控件。
下面我們就來(lái)看看如何創(chuàng )建自己的控件。
確定好采用上面三者中的哪一個(gè)方法后,創(chuàng )建相應的工程。之后,需要添加自己的字段,事件,和屬性。如果需要重新修改超類(lèi)的某個(gè)動(dòng)作,可能還要重載超類(lèi)對應的虛函數。如果需要自己畫(huà)控件的外觀(guān)(繼承自Control的空間必須這樣做),需要添加Paint事件的處理函數。
最后,我們再說(shuō)一下如何使自己的控件可以在.net studio中的設計器中使用。
1 如果在設計器中希望自己的控件改變大小之后能夠被重畫(huà),需要在控件類(lèi)的構造函數中使用下面的代碼:SetStyle(ControlStyles.ResizeRedraw, true); 另外,如果想使控件的背景色為透明色,也需要類(lèi)似的代碼,例如:SetStyle(ControlStyles.ResizeRedraw | ControlStyles.SupportTransparentBackColor, true);
2 關(guān)于控件類(lèi)的元數據。為了使設計器能正確地操作我們的控件,必須提供足夠的關(guān)于元數據(即描述控件自身的數據)。幾個(gè)常用的元數據包括
一 關(guān)于空間的元數據。常用的是控件默認的事件,默認的屬性,控件顯示在工具箱上的圖標。所謂默認事件,是指當在設計器中雙擊空間時(shí),要給哪個(gè)事件添加事件處理函數。所謂默認屬性,是指當我們在設計器中編輯控件的屬性時(shí),哪個(gè)屬性默認被激活??梢栽诳丶?lèi)的定義前添加下面的代碼指定默認事件和默認屬性:
[DefaultProperty("屬性名"),DefaultEvent("事件名"),ToolboxBitmap("路徑")]
另外,ToolboxBitmap元數據也可以是Type的實(shí)例,這樣,顯示在工具箱中的圖標就是對應控件的圖標。例如:
[ToolboxBitmap(typeof(Button))]
二 關(guān)于某個(gè)事件的元數據。主要是事件的描述信息,即在事件設計器中,當選中對應的事件時(shí),顯示在設計器下面的描述本事件的信息??梢栽谑录亩x前添加下面的代碼指定默認事件和默認屬性:
[Description("你自己的描述")]
三 關(guān)于某個(gè)屬性的元數據。主要包括Category,Description,DefaultValue,Browserable和Editor,其中Category是指本屬性顯示在設計器中的哪個(gè)分類(lèi)里,Description指當在設計器中選定本屬性時(shí),顯示在設計器下面的描述本屬性的信息。DefaultValue就不用說(shuō)了吧。至于Browserable,這個(gè)元數據太重要了,它指定對應的屬性在設計器里是否可見(jiàn)。若設為false,在設計器里就看不到此屬性了,因此最好顯式把它設成true(默認好像是false )。Editor也是一個(gè)很重要的屬性,它指定當要給此屬性選定值時(shí),應該采用什么編輯器。對于一般類(lèi)型的屬性(例如int,string等),設計器都能給出正確的默認的編輯器,但是如果設計器無(wú)法識別屬性的類(lèi)型,那么你就必須指定編輯器(你自己寫(xiě)的類(lèi),這些類(lèi)繼承自System.Drawing.Desing名字空間中的幾個(gè)類(lèi),幸運的是,這個(gè)名字空間中提供了幾個(gè)可以直接使用的編輯器,使得對于像圖像、字體這樣的屬性不用自己寫(xiě)編輯器了 )??梢栽趯傩缘亩x前添加代碼指定這些元數據。
下面是一個(gè)例子。
[ Category("Flash"),
Editor(typeof(FlashTrackBarValueEditor), typeof(UITypeEditor)),
DefaultValue(0)]
關(guān)于屬性還有一點(diǎn)需要注意,如果這個(gè)屬性和控件的外觀(guān)有關(guān),那么要在屬性的set段里引發(fā)重畫(huà)事件,這樣才能使控件得到正確的顯示
聯(lián)系客服