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

Windows Forms 中的主控描繪也稱為自訂繪圖,是變更特定控制項的視覺外觀的技術。

注意

本主題中的 「control」 一詞是用來表示衍生自 ControlComponent 的類別。

一般而言,Windows 會使用屬性設定自動處理繪製,例如 BackColor 判斷控制項的外觀。 運用主控描繪,您可接手繪製程序,來變更使用屬性無法取得的外觀項目。 例如,許多控制項都可讓您設定所顯示文字的色彩,但您只能使用單一色彩。 主控描繪可讓您執行作業,例如以黑色顯示文字的一部分,並以紅色顯示文字的一部分。

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

Windows Forms 控制項中的主控描繪

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

支援主控描繪的大部分控制項都會有 OwnerDrawDrawMode 屬性,以指出控制項是否會在繪製它自己時引發其繪圖相關事件。

沒有 OwnerDrawDrawMode 屬性的控制項,包括可提供自動發生的繪圖事件的 DataGridView 控制項,以及使用具有其主控描繪相關事件的外部轉譯類別所繪製的 ToolStrip 控制項。

有許多不同類型的繪圖事件,但若要在控制項內繪製單一項目,就會發生一般繪圖事件。 事件處理常式會接收 EventArgs 物件,此物件包含所繪製項目和其繪製工具的相關資訊。 例如,這個物件通常會在其父集合中包含專案的索引編號、 Rectangle 指出專案的顯示界限,以及 Graphics 呼叫繪製方法的物件。 針對部分事件,EventArgs 物件提供項目和方法的其他資訊,而您預設可以呼叫這些項目和方法來繪製項目的某些層面 (例如背景或焦點矩形)。

若要建立包含主控描繪自訂的可重複使用控制項,請建立新的類別,而此類別衍生自支援主控描繪的控制項類別。 請在新類別之適當 OnEventName 方法的覆寫中包括主控描繪程式碼,而不是處理繪圖事件。 在此情況下,請確定呼叫基底類別 OnEventName 方法,讓控制項的使用者可以處理主控描繪事件,並提供其他自訂。

下列 Windows Forms 控制項支援所有 .NET Framework 版本中的主控描繪:

下列控制項僅支援 .NET Framework 2.0 中的擁有者繪圖:

下列控制項支援擁有者繪圖,而且是 .NET Framework 2.0 的新功能:

下列各節提供所有這些控制項的其他詳細資料。

ListBox 和 ComboBox 控制項

ListBoxComboBox 控制項可讓您在控制項中以一個大小或不同大小繪製個別專案。

注意

CheckedListBox雖然控制項衍生自 ListBox 控制項,但不支援擁有者繪圖。

若要繪製每個專案的大小相同,請將 屬性設定 DrawModeOwnerDrawFixed 並處理 DrawItem 事件。

若要使用不同的大小繪製每個專案,請將 屬性設定 DrawModeOwnerDrawVariable ,並同時處理 MeasureItemDrawItem 事件。 MeasureItem 事件可讓您指出該項目在發生 DrawItem 事件之前的大小。

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

元件 MenuItem 代表 或 ContextMenu 元件中的 MainMenu 單一功能表項目。

若要繪製 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 事件。

若要在 屬性設定為 DetailsView ,在 控制項中繪製每個子專案或資料行標頭,請處理 DrawSubItemDrawColumnHeader 事件。

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

TreeView 控制項

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

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

若要繪製每個節點的所有元素,請將 屬性設定 DrawModeOwnerDrawAll ,並處理 DrawNode 事件以繪製您需要的元素,例如文字、圖示、核取方塊、加號和減號,以及連接節點的線條。

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

DataGridView 控制項

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

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

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

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

ToolStrip 控制項

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

若要提供控制項的 ToolStrip 自訂轉譯,請將 、 ToolStripManagerToolStripPanel 、 或 ToolStripContentPanelToolStrip 屬性設定 RendererToolStripRenderer 物件,並處理 類別所提供的 ToolStripRenderer 一或多個繪圖事件。 或者,將 Renderer 屬性設定為衍生自 ToolStripRendererToolStripProfessionalRenderer 或 的自有類別實例,以 ToolStripSystemRenderer 實作或覆寫特定的 On EventName 方法。

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

另請參閱