使用內建主控描繪支援的控制項
Windows Forms 中的主控描繪也稱為自訂繪圖,是變更特定控制項的視覺外觀的技術。
一般而言,Windows 會使用 BackColor 這類屬性設定來判斷控制項的外觀,以自動處理繪製。 運用主控描繪,您可接手繪製程序,來變更使用屬性無法取得的外觀項目。 例如,許多控制項都可讓您設定所顯示文字的色彩,但您只能使用單一色彩。 主控描繪可讓您執行作業,例如以黑色顯示文字的一部分,並以紅色顯示文字的一部分。
實際上,主控描繪與在表單上繪製圖形類似。 例如,您可以在表單之 Paint 事件的處理常式中使用圖形方法來模擬 ListBox
控制項,但必須撰寫自己的程式碼來處理所有使用者互動。 運用主控描繪,此控制項會使用您的程式碼來繪製其內容,但保有其所有內建功能。 您可以使用圖形方法來繪製控制項中的每個項目,或在使用每個項目之其他層面的預設外觀時自訂每個項目的某些層面。
Windows Forms 控制項中的主控描繪
若要在支援主控描繪的控制項中執行主控描繪,您通常會設定一個屬性,並處理一或多個事件。
支援主控描繪的大部分控制項都會有 OwnerDraw
或 DrawMode
屬性,以指出控制項是否會在繪製它自己時引發其繪圖相關事件。
沒有 OwnerDraw
或 DrawMode
屬性的控制項,包括可提供自動發生的繪圖事件的 DataGridView
控制項,以及使用具有其主控描繪相關事件的外部轉譯類別所繪製的 ToolStrip
控制項。
有許多不同類型的繪圖事件,但若要在控制項內繪製單一項目,就會發生一般繪圖事件。 事件處理常式會接收 EventArgs
物件,此物件包含所繪製項目和其繪製工具的相關資訊。 例如,這個物件通常會包含項目在父集合 (即 Rectangle,指出項目顯示界限) 內的索引編號,以及用於呼叫繪製方法的 Graphics 物件。 針對部分事件,EventArgs
物件提供項目和方法的其他資訊,而您預設可以呼叫這些項目和方法來繪製項目的某些層面 (例如背景或焦點矩形)。
若要建立包含主控描繪自訂的可重複使用控制項,請建立新的類別,而此類別衍生自支援主控描繪的控制項類別。 請在新類別之適當 On
EventName 方法的覆寫中包括主控描繪程式碼,而不是處理繪圖事件。 在此情況下,請確定呼叫基底類別 On
EventName 方法,讓控制項的使用者可以處理主控描繪事件,並提供其他自訂。
下列 Windows Forms 控制項支援所有 .NET Framework 版本中的主控描繪:
MenuItem (由 MainMenu 和 ContextMenu 使用)
下列控制項只有在 .NET Framework 2.0 中才支援主控描繪:
下列控制項支援主控描繪,而且是 .NET Framework 2.0 中的新項目:
下列各節提供所有這些控制項的其他詳細資料。
ListBox 和 ComboBox 控制項
ListBox 和 ComboBox 控制項可讓您以一個大小或不同大小描繪控制項中的個別項目。
注意
雖然 CheckedListBox 控制項衍生自 ListBox 控制項,但它不支援主控描繪。
若要使用相同大小來描繪每個項目,請將 DrawMode
屬性設定為 OwnerDrawFixed,並處理 DrawItem
事件。
若要使用不同大小來描繪每個項目,請將 DrawMode
屬性設定為 OwnerDrawVariable,並同時處理 MeasureItem
和 DrawItem
事件。 MeasureItem
事件可讓您指出該項目在發生 DrawItem
事件之前的大小。
如需詳細資訊 (包括程式碼範例),請參閱下列主題:
MenuItem 元件
MenuItem 元件代表 MainMenu 或 ContextMenu 元件中的單一功能表項目。
若要描繪 MenuItem,請將其 OwnerDraw
屬性設定為 true
並處理其 DrawItem
事件。 若要自訂功能表項目在發生 DrawItem
事件之前的大小時,請處理項目的 MeasureItem
事件。
如需詳細資訊 (包括程式碼範例),請參閱下列參考主題:
TabControl 控制項
TabControl 控制項可讓您在控制項中描繪個別索引標籤。 主控描繪只會影響索引標籤,並不會影響 TabPage 內容。
若要在 TabControl 中描繪每個索引標籤,請將 DrawMode
屬性設定為 OwnerDrawFixed,並處理 DrawItem
事件。 只有在控制項中顯示索引標籤時,才會針對該索引標籤發生此事件一次。
如需詳細資訊 (包括程式碼範例),請參閱下列參考主題:
ToolTip 元件
ToolTip 元件可讓您在顯示工具提示時描繪整個 ToolTip。
若要描繪 MenuItem,請將其 OwnerDraw
屬性設定為 true
並處理其 DrawItem
事件。 若要在發生 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 控制項的自訂轉譯,請將 ToolStrip、ToolStripManager、ToolStripPanel 或 ToolStripContentPanel 的 Renderer
屬性設定為 ToolStripRenderer
物件,並處理 ToolStripRenderer
類別所提供的一或多個描繪事件。 或者,將 Renderer
屬性設定為衍生自 ToolStripRenderer
、ToolStripProfessionalRenderer或 ToolStripSystemRenderer 的自控類別執行個體,以實作或覆寫特定 On
EventName 方法。
如需詳細資訊 (包括程式碼範例),請參閱下列主題: