C 控制項開發(四)

2021-09-05 23:15:00 字數 2320 閱讀 9246

七、 編寫和顯示訂製的型別

屬性視窗中的編輯有如下三種工作方式:一,有些場合可以作為字串來編輯,然後由typeconverter來實現型別的轉換。二,可以顯示乙個下拉列表來選擇值。三,乙個省略按鈕提供其他的ui介面來編輯值,比如filedialog和fontpicker。我們已經講過了字串形式,接著我們就來看下拉列表。

.net framework已經包含了好幾種下拉列表的例子,如color,accessiblerole,dock等屬性。我們從下圖可以看到下拉列表的具體實現。

圖4. 下拉列表編輯器

實現下拉的工作同樣是由typeconverter來定義。如果看typeconverter的說明,可以看到有三個虛函式來實現這個功能:getstandardvaluessupported(),getstandardvalues()和getstandardvalue***clusive()。過載這些方法,我們可以為屬性提供預先定義好的值列表。實際上,是typeconverter實現了下拉列表中的列舉值。屬性視窗自己本身並沒有**來處理這種下拉列表的編輯,而僅僅是使用typeconverter的方法。

舉個例來說,我們有乙個包含relation屬性的familymember元件,允許使用者選擇與其他人之間的關係。如果要使設計時介面更友好的話,屬性視窗應該使用下拉列表來提供一些常用值的選擇:如mother,father,daughter和sister等。除了提供的常用值之外,元件使用者也可以輸入其他的表示關係的字串值。

public class familymember : component

set }

} internal class relationconverter : stringconverter

); public override bool getstandardvaluessupported(

itypedescriptorcontext context)

public override bool getstandardvalue***clusive(

itypedescriptorcontext context)

public override standardvaluescollection getstandardvalues(

itypedescriptorcontext context)

} 不過如何做乙個更加定製化的ui呢?我們可以使用uitypeeditor類。uitypeeditor類包括了在顯示屬性或者是編輯屬性(比如下拉列表和省略按鈕)時可以由屬性視窗呼叫的方法。

一些類似於image,color,font.name的屬性型別會在屬性值的左邊有乙個小的圖形化表示,這是通過過載uitypeeditor的paintvalue方法實現的。當屬性視窗得到定義了編輯器的屬性值的時候,它就提供給編輯器乙個矩形框物件(rectangle)和畫圖的物件(graphic),他們都包含在paintvalue方法的事件引數paintvalueeventargs中。舉個例子來說,我們有乙個grade類需要有圖形化的表示。下面就是我們的grade類。

[editor(typeof(gradeeditor), typeof(system.drawing.design.uitypeeditor))]

[typeconverter(typeof(gradeconverter))]

public struct grade

public int value

} }

當我們輸入乙個年齡的時候,我們可以看到左邊的乙個圖形表示。

圖5. 輸入年齡

實現它並不困難。注意到賦給grade類的editorattribute特性,它就是下面的這個類:

public class gradeeditor : uitypeeditor

public override void paintvalue(paintvalueeventargs pe)

else if (g.value > 60)

else

// draw that bitmap onto the su***ce provided.

bitmap b = new bitmap(typeof(gradeeditor), bmpname);

pe.graphics.drawimage(b, pe.bounds);

b.dispose(); }

} 像我們上面提到的,uitypeeditor可以實現屬性的下拉選擇和彈出對話方塊選擇。後面的例子會包括這樣的**。如果想知道進一步的資訊的話,就要參考uitypeeditor.geteditstyle和uitypeeditor.editvalue方法以及iwindowsformseditorservice介面

C 控制項開發

用c 開發乙個簡易的登入註冊視窗 主程式using system using system.collections.generic using system.linq using system.threading.tasks using system.windows.forms namespace ...

使用C 開發ActiveX控制項

最近弄了乙個在qt中使用c 控制項的功能,使用的方法是通過c 生產activex控制項,在qt中使用該activex控制項。本文這裡簡單的介紹一下如何用c 生成activex控制項。1.建立winform的usercontrol工程,在控制項的屬性頁中選擇 使程式集com可見 2.分配guid,在控...

使用C 開發ActiveX控制項

最近弄了乙個在qt中使用c 控制項的功能,使用的方法是通過c 生產activex控制項,在qt中使用該activex控制項。本文這裡簡單的介紹一下如何用c 生成activex控制項。1.建立winform的usercontrol工程,在控制項的屬性頁中選擇 使程式集com可見 2.分配guid,在控...