天天看點

Window Form 控件基礎

在開始正式介紹如何開發自定義控件之前,有必要先了解一下控件開發的基礎知識。下面從控件的概念、分類和開發模式上對控件做一個基本的概述。

1 控件的概念

所謂的控件就是對資料和方法的封裝。一般來說,控件都有自己的屬性、方法和事件。控件的屬性是存儲控件資料的容器。控件的方法則是實作控件所需的功能。為了提高開發的效率和界面的标準化,一般的軟體公司都有一套自己封裝的 UI 控件,很多程式員都是在使用這些控件,很少有機會來開發這些自定義控件。控件的設計和開發是一項比較繁重的工作,同時對程式員的要求也比較高,需要掌握 GDI+程式設計、事件模型、Window API 和面向對象開發等知識。一個使用比較友善的控件,其背後往往是大量的代碼。雖然開發自定義控件是一個比較複雜的過程,但也是一個一勞永逸的過程。開發控件的最大意義在于封裝重複的工作,其次是可以擴充現有控件的功能。

另外,和控件(Control)概念容易混淆的是是元件(Component)。一般來說,控件是具有使用者界面的可視化的元件。例如窗體中的文本框、清單框。而元件一般使用者邏輯處理,比如實作計算和性能采集等功能。

2 控件的類型

以 WinForm 控件來說,控件通常有三種類型:

  • 複合控件(Composite Controls)

複合控件将現有的各種控件組合起來,形成一個新的控件,将集中控件的功能集中起來。

  • 擴充控件(Extended Controls)

擴充控件在現有控件的控件的基礎上派生出一個新的控件,為原有控件增加新的功能或者修改原有控件的控能。

  • 自定義控件(Custom Controls)

自定義控件直接從 System.Windows.Forms.Control 類派生出來。Control 類提供控件所需要的所有基本功能,包括鍵盤和滑鼠的事件處理。自定義控件是最靈活最強大的方法,但是對開發者的要求也比較高,你必須為 Control 類的 OnPaint 事件寫代碼,你也可以重寫 Control 類的 WndProc 方法,處理更底層的 Windows 消息,是以你必須掌握一定的 GDI+和Windows API 知識。

3 控件的繼承

一般來說,控件的開發不是從零開始的,而是根據需要實作的控件的功能,通過繼承相關的類來實作的,這樣可以大大降低開發控件的難度和成本。

  • 繼承 Windows 窗體控件

自定義控件可以繼承自任何現有的 Windows 窗體控件,此方法可以保留 Windows 窗體控件所有已有的功能和屬性,控件開發人員隻需要添加自定義的屬性、方法或其他功能擴充即可。例如,如果現在需要自定義一個隻接受數值型的數值文本框,那麼開發此數值文本框可以建立一個從 TextBox 派生的控件,并為此控件添加一個驗證輸入是否為數值的判斷方法,每當文本框中的文本發生更改時就會調用此方法,另外如果需要定制數值文本框的外觀,可以通過重寫基類 TextBox 的 OnPaint 方法将自定義外觀添加到此控件上。

一般來說,處于下列情況時建議從 Windows 窗體控件繼承:

大多數所需的功能已經與現有的 Windows 窗體控件相同

不需要自定義圖形接口,或者想為現有控件設計一個新的外觀

  • 繼承 UserControl

使用者控件(UserControl)是封裝在公共容器内的 Windows 窗體控件的集合。此容器包含與每個 Windows 窗體控件相關聯的所有固有功能,允許控件開發人員有選擇地公開和綁定内部的屬性。例如,如果現在需要開發一個 IP 文本框控件,隻允許輸入 IP 位址。那麼開發此IP控件可以通過繼承使用者控件,然後在使用者控件上添加4個TextBox,在TextBox

中間放入一個 Label(設定其 Text 為.的符号),在通過每個文本框的文本變更時刻檢測使用者輸入的字元隻允許為 0~255 即可。

一般來說,如果要将若幹個 Windows 窗體控件的功能合成一個可重新使用的單元,則建議從 UserControl 類繼承。

  • 繼承 Control

建立一個新的控件,除了上面介紹的繼承自現有窗體控件和使用者控件類以外,也可以通 過繼承 Control 類從頭開發一個控件。Control 類提供控件(例如事件)所需的所有基本功能,但不提供控件特定的功能或圖形界面。與通過從使用者控件或現有 Windows 窗體控件繼承建立控件相比,通過從 Control 類繼承建立控件需要耗費更多的心思和精力。因為控件開發人員必須為控件的 OnPaint 事件編寫代碼以及所需的任何功能特定代碼,但同時也允許控件開發人員根據自己的需要,靈活地自定義調整控件。例如,如果需要開發一個時鐘控件,此控件模拟時鐘的外觀和操作,通過添加 Timer 元件,并響應内部計時器元件的Tick 事件來每秒調用自定義繪圖方法來模拟時鐘指針運動。

一般來說,處于下列情況時建議從 Control 類繼承:

想要提供控件的自定義圖形化表示形式。

需要實作無法從标準控件獲得的自定義功能。

繼續閱讀