WinForm自定義控件一

聲明:本文是看了白話博客記錄下的精華。如果想得到更好的理解或代碼。請看白話programming博客.http://www.cnblogs.com/guanjinke/archive/2006/12/04/582084.html.在此對白話programming表示感謝。
 
自己開發的WinForm控件通常有三種類型:複合控件(Composite Controls),擴展控件(Extended Controls),自定義控件(Custom Controls)。   
      複合控件:將現有的各種控件組合起來,形成一個新的控件,將集中控件的功能集中起來。
      擴展控件:在現有控件的控件的基礎上派生出一個新的控件,爲原有控件增加新的功能或者修改原有控件的控能。
      自定義控件:直接從System.Windows.Forms.Control類派生出來。Control類提供控件所需要的所有基本功能,包括鍵盤和鼠標的事件處理。自定義控件是最靈活最強大的方法,但是對開發者的要求也比較高,你必須爲Control類的OnPaint事件寫代碼,你也可以重寫Control類的WndProc方法,處理更底層的Windows消息,所以你應該瞭解GDI+和Windows API。    
      本系列文章主要介紹自定義控件的開發方法。
      控件(可視化的)的基本特徵:
      1.       可視化。
      2.       可以與用戶進行交互,比如通過鍵盤和鼠標。
      3.       暴露出一組屬性和方法供開發人員使用。
      4.       暴露出一組事件供開發人員使用。
      5.       控件屬性的可持久化。
      6.       可發佈和可重用。
WinForm常用的Attribute:
BrowsableAttribute:描述是否一個屬性或事件應該被顯示在屬性瀏覽器裏。
   CategoryAttribute:描述一個屬性或事件的類別,當使用類別的時候,屬性瀏覽器按類別將屬性分組。
   DescriptionAttribute:當用戶在屬性瀏覽器裏選擇屬性的時候,description裏指定的文本會顯示在屬性瀏覽器的下邊,向用戶顯示屬性的功能。
   BindableAttribute:描述是否一個屬性傾向於被綁定。
   DefaultPropertyAttribute:爲組件指定一個默認的屬性,當用戶在Form設計器上選擇一個控件的時候,默認屬性會在屬性瀏覽器裏被選中。   
   DefaultValueAttribute:爲一個簡單類型的屬性設置一個默認值。
   EditorAttribute:爲屬性指定一個特殊的編輯器。
   LocalizableAttribute:指示一個屬性是否能被本地化,任何有這個Attribute的屬性將會被持久化到資源文件裏。   
   DesignerSerializationVisibilityAttribute:指示一個屬性是否或者如何持久化到代碼裏。
   TypeConverterAttribute:爲屬性指定一個類型轉換器,類型轉換器能將屬性的值轉化成其它的數據類型。
   DefaultEventAttribute:爲組件指定一個默認的事件,當用戶在form設計其中選擇一個控件的時候,在屬性瀏覽器中這個事件被選中。
DesignerSerializationVisibilityAttribute的功能是指示一個屬性是否串行化和如何串行化,它的值是一個枚舉,一共有三種類型Content,Hidden,Visible。Content指示代碼生成器爲對象包含的內容生成代碼,而不是爲對象本身,Hidden指示代碼生成器不爲對象生成代碼,visible指示代碼生成器爲對象生成代碼。假如你的控件有一個集合屬性,又想在設計時自動將集合屬性的內容生成代碼,那麼就使用這個Attribute,並將值設爲DesignerSerializationVisibility.Content。
 
TypeConverterAttribute的作用就更大一些,也稍微複雜一些。TypeConverterAttribute主要的目的是爲屬性指定一個類型轉換器,這個轉化器可以將屬性的值轉換城其它的類型。.NET框架已經爲大部分常用的類型都提供了類型轉換器,比如Color就有ColorConverter,枚舉類型就有EnumConverter,等等,所以一般情況下你沒有必要寫類型轉換器,如果你的屬性的特殊的類型或者自定義的類型那麼就必須要寫了。類型轉換器都是從System.ComponentModel.TypeConverter派生出來的,你需要重寫其中的一些方法來達到轉換的目的,在我們開發的過程中,其實只關心屬性的值如何轉換成字符串(因爲屬性的值需要在屬性瀏覽器裏顯示出來,屬性瀏覽器裏顯示的都是字符串)和源代碼(需要自動爲屬性的值生成源代碼以實現持久化),當然反過來,也要將字符串和源代碼轉換成屬性的值。另外使用TypeConverter也可以實現子屬性,讓屬性的子屬性也顯示在屬性瀏覽器裏,並且可以摺疊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章