在C 中建立自定義控制項

2021-04-12 20:48:18 字數 2241 閱讀 5833

在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段裡引發重畫事件,這樣才能使控制項得到正確的顯示

建立自定義控制項

在前一篇文章中 中,我將乙個公共視窗控制項進行了之類劃分,目的是為了修飾其行為或者說是擴充套件其功能。有時候,你只能將公共視窗控制項擴充套件到這樣的底部。我遇到的乙個例子是乙個比較普遍的話題即需要乙個格網控制項並且編輯tabular資料。我對clistctrl進行了之類劃分,並擴充套件使其能夠進行子...

建立自定義控制項

引入布局可以使布局統一,但如果布局中有控制項要能夠響應事件,我們還是需要在每個活動中對控制項進行事件的註冊。我們可以使用自定義控制項的方式解決 新建titlelayout 類並繼承linearlayout,package com.example.layouttest import android.c...

建立web自定義控制項

建立asp.net web自定義控制項 例程1 web自定義控制項程式設計是asp.net程式設計裡面比較難的一部分,尤其是複雜的控制項需要用到平常不常用的一些技術技巧。下面根據一些我自己的實踐經驗,向讀者介紹一下這方面的技術。簡單的繼承控制項 confirmbutton 我們在用asp.net編寫...