共用方式為


使用內建主控描繪支援的控制項

更新:2007 年 11 月

Windows Form 中的主控描繪也稱為自訂描繪,是一項用來變更某些控制項的視覺外觀的技巧。

注意事項:

本主題中的「控制項」這個詞彙是用來表示衍生自 ControlComponent 的類別。

一般而言,Windows 會使用屬性設定 (例如 BackColor) 來自動處理繪製,以決定控制項的外觀。您可以透過主控描繪來取代繪製過程,並變更使用屬性所無法取得的外觀項目。例如,許多控制項可以讓您設定所顯示文字的色彩,但是只限於單一色彩。主控描繪則可以讓您做到像是將文字的一部分顯示為黑色而一部分顯示為紅色的情況。

實際上,主控描繪類似於在表單上繪製圖形。例如,您可以在表單 Paint 事件的處理常式中,利用圖形方法來模擬 ListBox 控制項,但是您必須撰寫自己的程式碼來處理所有的使用者互動。透過主控描繪,控制項會使用您的程式碼來繪製其內容,但是保有它所有的內建能力。您可以使用圖形方法來繪製控制項中的每個項目,或者在為每個項目的某些方面使用預設外觀時,自訂每個項目的其他方面。

Windows Form 控制項中的主控描繪

若要在支援主控描繪的控制項中執行主控描繪時,您通常會設定一個屬性並處理一或多個事件。

大部分支援主控描繪的控制項都具有 OwnerDraw 或 DrawMode 屬性,用來指示控制項是否會在繪製它本身時引發繪製相關的事件。

不具有 OwnerDraw 或 DrawMode 屬性的控制項包括 DataGridView 控制項 (它提供會自動發生的繪製事件) 和 ToolStrip 控制項 (它是使用具有自己的繪製相關事件的外部呈現類別所繪製)。

繪製事件有很多不同的種類,但是一般繪製事件的發生是為了繪製控制項中的單一項目。事件處理常式會收到 EventArgs 物件,其中包含所繪製項目的相關資訊和可以用來繪製此項目的工具。例如,這個物件通常會包含其在父集合內的項目索引編號、指示項目顯示界限的 Rectangle,以及用來呼叫繪製方法的 Graphics 物件。對於某些事件,EventArgs 物件會提供項目的其他資訊和方法,您可以呼叫這些方法以預設繪製項目的某些方面,例如背景或焦點矩形 (Focus Rectangle)。

若要建立可重複使用的控制項 (包含您的主控描繪自訂),請建立一個衍生自支援主控描繪的控制項類別的新類別。不同於處理繪製事件,它會將您的主控描繪程式碼包含在新類別中適當的 OnEventName 方法的覆寫中。請確定在這個案例中呼叫基底類別的 OnEventName 方法,這樣控制項的使用者就可以處理主控描繪事件和提供其他的自訂。

下列 Windows Form 控制項,在所有 .NET Framework 版本中都支援主控描繪:

下列控制項只在 .NET Framework 2.0 版中支援主控描繪:

下列控制項支援主控描繪,並且是 .NET Framework 2.0 版中的新控制項:

下面章節提供這些控制項中每一個的其他詳細資料。

ListBox 和 ComboBox 控制項

ListBoxComboBox 控制項可以讓您以一種大小或各種大小,繪製控制項中的個別項目。

注意事項:

雖然 CheckedListBox 控制項是衍生自 ListBox 控制項,但是它並不支援主控描繪。

若要以相同大小繪製每個項目,請將 DrawMode 屬性設定為 OwnerDrawFixed,並處理 DrawItem 事件。

若要使用不同的大小繪製每個項目,請將 DrawMode 屬性設定為 OwnerDrawVariable,並處理 MeasureItem 和 DrawItem 事件。MeasureItem 事件可以讓您在項目的 DrawItem 事件發生前,指示該項目的大小。

如需詳細資訊,包括程式碼範例在內,請參閱下列主題:

MenuItem 元件表示 MainMenuContextMenu 元件中的單一功能表項目。

若要繪製 MenuItem,請將 OwnerDraw 屬性設定為 true,並處理 DrawItem 事件。若要在 DrawItem 事件發生之前自訂功能表項目的大小,請處理項目的 MeasureItem 事件。

如需詳細資訊 (包括程式碼範例),請參閱下列參考主題:

TabControl 控制項

TabControl 控制項可以讓您繪製控制項中的個別索引標籤。主控描繪只會影響索引標籤;不會影響 TabPage 內容。

若要繪製 TabControl 中的每個索引標籤,請將 DrawMode 屬性設定為 OwnerDrawFixed,並處理 DrawItem 事件。這個事件只會在控制項中的索引標籤可見時,對每個索引標籤發生一次。

如需詳細資訊 (包括程式碼範例),請參閱下列參考主題:

ToolTip 元件

ToolTip 元件可以讓您在工具提示顯示時,繪製整個工具提示。

若要繪製 ToolTip,請將 OwnerDraw 屬性設定為 true,並處理 Draw 事件。若要在 Draw 事件發生之前自訂 ToolTip 的大小,請處理 Popup 事件,並在事件處理常式中設定 ToolTipSize 屬性。

如需詳細資訊 (包括程式碼範例),請參閱下列參考主題:

ListView 控制項

ListView 控制項可以讓您繪製控制項中的個別項目、子項目和資料行行首。

若要啟用控制項中的主控描繪,請將 OwnerDraw 屬性設定為 true。

若要描繪控制項中的每個項目,請處理 DrawItem 事件。

若要在 View 屬性設定為 Details 時,繪製控制項中的每個子項目或資料行行首,請處理 DrawSubItem 和 DrawColumnHeader 事件。

如需詳細資訊 (包括程式碼範例),請參閱下列參考主題:

TreeView 控制項

TreeView 控制項可以讓您繪製控制項中的個別節點。

若只要繪製顯示在每個節點中的文字,請將 DrawMode 屬性設定為 OwnerDrawText,並處理 DrawNode 事件以繪製文字。

若要繪製每個節點的所有項目,請將 DrawMode 屬性設定為 OwnerDrawAll,並處理 DrawNode 事件以繪製您所需要的任何項目,例如文字、圖示、核取方塊、加減號以及連接節點的線。

如需詳細資訊 (包括程式碼範例),請參閱下列參考主題:

DataGridView 控制項

DataGridView 控制項可以讓您繪製控制項中的個別儲存格和資料列。

若要繪製個別儲存格,請處理 CellPainting 事件。

若要繪製資料列或資料列的項目,請處理 RowPrePaint 和 RowPostPaint 事件其中之一或兩者。RowPrePaint 事件會在繪製資料列中的儲存格之前發生,而 RowPostPaint 事件會在繪製儲存格之後發生。您可以處理這兩個事件和 CellPainting 事件,分別繪製資料列背景、個別儲存格和資料列前景,或者在需要它們的地方提供特定的自訂,並為資料列的其他項目使用預設顯示。

如需詳細資訊,包括程式碼範例在內,請參閱下列主題:

ToolStrip 控制項

ToolStrip 和衍生控制項可以讓您自訂其外觀的任何方面。

若要為 ToolStrip 控制項提供自訂呈現,請將 ToolStripToolStripManagerToolStripPanelToolStripContentPanel 的 Renderer 屬性設定為 ToolStripRenderer 物件,並處理 ToolStripRenderer 類別所提供的許多繪製事件中的一或多個。或者,請將 Renderer 屬性設定為衍生自可實作或覆寫特定 OnEventName 方法之 ToolStripRenderer、ToolStripProfessionalRendererToolStripSystemRenderer 的類別執行個體。

如需詳細資訊,包括程式碼範例在內,請參閱下列主題:

請參閱

其他資源

在 Windows Form 上使用的控制項