自訂控制項 (Windows Forms .NET)

使用 Windows Forms,您可以透過繼承來建立新控制項或修改現有控制項。 本文重點介紹新控制項建立方式之間的差異,並提供有關如何為您的專案選擇特定控制項類型的資訊。

基底控制項類別

Control 類別是 Windows Forms 控制項的基底類別。 它提供 Windows Forms 應用程式中視覺顯示所需的基礎結構,並提供下列功能:

  • 公開視窗控制代碼。
  • 管理訊息路由。
  • 提供滑鼠和鍵盤事件,以及其他許多使用者介面事件。
  • 提供進階版面配置功能。
  • 包含多個專用於視覺顯示的屬性,例如 ForeColorBackColorHeightWidth

因為基底類別提供了非常多的基礎結構,所以開發您自己的 Windows Forms 控制項相對容易。

建立您自己的控制項

您可以建立三種類型的自訂控制項:使用者控制項、擴充控制項和自訂控制項。 下表可協助您決定應該建立的控制項類型:

如果... 建立 ...
  • 您想要將數個 Windows Form 控制項的功能結合成一個可重複使用的單位。
透過繼承自 System.Windows.Forms.UserControl 來設計使用者控制項
  • 大部分的所需功能已經與現有的 Windows Form 控制項相同。
  • 您不需要自訂的圖形化使用者介面,或是您想要為現有的控制項設計新的圖形化使用者介面。
繼承自特定 Windows Forms 控制項的延伸控制項
  • 您想要提供控制項的自訂圖形表示。
  • 您需要實作標準控制項無法提供的自訂功能。
透過繼承自 System.Windows.Forms.Control 來建立自訂控制項

使用者控制項

使用者控制項是以單一控制項提供給取用者的 Windows Forms 控制項集合。 這種控制項稱為複合控制項。 包含的控制項稱為「組成控制項」

使用者控制項保存了與每個包含的 Windows Forms 控制項相關聯的所有固有功能,並可讓您選擇性地公開和繫結其屬性。 使用者控制項也提供大量的預設鍵盤處理功能,讓您在開發時不需要付出額外努力。

例如,可以建置使用者控制項來顯示資料庫中的客戶地址資料。 此控制項會包含用於顯示資料庫欄位的 DataGridView 控制項、用於處理對資料來源進行繫結的 BindingSource,以及用於在記錄之間移動的 BindingNavigator 控制項。 您可以選擇性地公開資料繫結屬性,而且可以封裝整個控制項並在各個應用程式之間重複使用。

如需詳細資訊,請參閱使用者控制項概觀

擴充控制項

您可以從任何現有的 Windows Form 控制項衍生繼承的控制項。 使用這種方法,您可以保留 Windows Forms 控制項的所有固有功能,然後藉由新增自訂屬性、方法或其他功能來擴充該功能。 使用這個選項,您可以覆寫基底控制項的繪製邏輯,然後藉由變更其外觀,以擴充其使用者介面。

例如,您可以建立控制項,該控制項衍生自 Button 控制項,會追蹤使用者已點擊它多少次。

在一些控制項中,您也可以藉由覆寫基底類別的 OnPaint 方法,將自訂外觀新增至控制項的使用者圖形化介面。 對於追蹤點擊的擴充按鈕,您可以覆寫 OnPaint 方法以呼叫 OnPaint 的基底實作,然後在 Button 控制項用戶端區域的一角繪製點擊計數。

自訂控制項

建立控制項的另一個方法是藉由繼承自 Control,從頭建立一個控制項。 Control 類別會提供控制項所需的所有基本功能,包括滑鼠和鍵盤處理事件,但不提供控制項特有的功能或圖形化介面。

透過繼承自 Control 類別來建立控制項,比繼承自 UserControl 或現有的 Windows Forms 控制項需要更多的思考和投入工作。 因為已為您保留許多實作,所以您的控制項比複合或擴充控制項具有更大的彈性,您可以量身打造您的控制項以符合您的確切需求。

若要實作自訂控制項,您必須撰寫控制項 OnPaint 事件的程式碼,這會控制控制項的視覺化繪製方式。 您也必須為控制項撰寫任何功能特定行為。 您也可以覆寫 WndProc 方法並直接處理 Windows 訊息。 這是建立控制項最強大的方式,但是若要有效使用這項技術,您必須先熟悉 Microsoft Win32® API。

自訂控制項的範例是複製類比時鐘外觀和行為的時鐘控制項。 叫用自訂繪製以促使時鐘指針移動,回應內部 Timer 元件的 Tick 事件。

自訂設計體驗

如果您需要實作自訂設計階段經驗,您可以撰寫自己的設計工具。 對於複合控制項,請從 ParentControlDesignerDocumentDesigner 類別衍生您的自訂設計工具類別。 對於擴充和自訂控制項,請從 ControlDesigner 類別衍生您的自訂設計工具類別。

使用 DesignerAttribute 將您的控制項與設計工具產生關聯。

下列資訊已過期,但可能對您有幫助。