InPowerS.Net

 找回密碼
 註冊
搜索
查看: 5635|回復: 0

[轉貼]使用VB.NET開發自訂Windows控制項

[複製鏈接]
發表於 2008-12-25 22:29:45 | 顯示全部樓層 |閱讀模式
前言
Microsoft® Visual Basic® 的元件支援歷來都是它的一大賣點,於是協力廠商軟體發展商們紛紛開發出各種具有新功能性的可視控制項 (也有少數非可視控制項) 供 Visual Basic 程式師選用。這種特殊的 Visual Basic 開發形式創造了無數的協力廠商控制項——有的是共用軟體/自由軟體,有的則被放到櫃檯上銷售。現在,人們甚至可以直接用 Visual Basic 開發自己的可視/非可視元件了。於是,元件的數量迅速增長,其中相當一部分都是程式師 (或者開發小組) 為針對自己的開發任務設計的。
注意 你或你的開發小組過去購買的 Microsoft ActiveX 控制項往往無須修改或重寫就能直接移植到微軟 .NET 環境下。具體而言,只要進入 Microsoft Visual Studio® .NET 的 IDE (整合式開發環境) 環境,依次從功能表中選擇:工具 Tool -> 自訂工具箱 Customize Toolbox) ,或者使用 .NET 框架實用程式 Aximp.exe (ActiveX 控制項導入程式) ,就能讓 .NET 應用程式中調用現成的 ActiveX 控制項了。可是,一旦某個控制項在 .NET 環境下工作不正常,它的作者恐怕就應該考慮升級該控制項了。所以,為了能在 .NET 環境中正常使用購來的協力廠商 ActiveX 控制項,就應該到開發商的 Web 網站去看看它有沒有出升級版或者 .NET 版。
在 .NET 程式設計世界裡,人們對自訂 UI 組件的需求依然存在,只不過它們的創建過程有所不同。本文將探討兩個問題:為什麼要創建自己的 Microsoft Windows® 控制項?在 Visual Basic .NET 中開發控制項時有哪些方面不同於以往的 5.0 / 6.0 版?  
為什麼要開發你自己的控制項?
為了限制 Windows 表單TextBox 控制項的文本類型,可以在表單代碼中添加該控制項的KeyPress 事件處理常式,以攔截用戶的每次擊鍵並檢查該鍵對應的字元能否進入 TextBox :
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles TextBox1.KeyPress
If Not Char.IsDigit(e.KeyChar) Then
e.Handled = True
Else
e.Handled = False
End If
End Sub
注意 單純依靠捕捉擊鍵事件是無法確保輸入 TextBox 的文本全是數位的,因為使用者有時不是直接向 TextBox 中敲入字元,而是通過剪貼板粘貼字元給 TextBox ;何況 TextBox 文本的初值就有可能包含非法的字元。某些其它事件比如 TextChanged 等,或許能夠捕捉到更多非法輸入,但我更喜歡用 Validating 或者 Leave 事件,它們是在使用者離開輸入控制項之後才對 TextBox 進行字元合法性檢查。這麼做誠然放棄了對用戶輸入的即時反應,卻允許用戶首先通過剪貼板輸入“輕度犯規”的文本字串 ,比如在禁止空格的輸入框中粘貼 “3425 2343 2342 2342”,然後手工糾正輸入框裡的“犯規”字元。
向控制項中手工添加事件處理常式代碼並不太難,可是當你面臨更複雜的程式設計任務,比如檢驗郵寄地址或者汽車的 VIN # (車輛識別號碼) 的字元合法性時,你還會感到如此輕鬆嗎?此時你會希望把同一段事件處理常式用於多個表單甚至多個專案,或者將它提供給開發小組的其他成員共用。然而,提取表單中的代碼片段,連同安裝指南和控制項的命名規則一起發佈,卻是一個惡夢的開端。好在天無絕人之路,你只要把它連同一個自訂控制項發佈,就不會遭遇這種惡夢了,因為此時使用者介面和相關代碼都位於獨立的元件中,而元件的發佈相對要容易得多。通過元件發佈的代碼片段在升級上也方便些:你只需發佈新版的元件即可,再也不必通過種種管道公佈新的代碼片段讓程式師手工覆蓋原先的代碼了!
繼承性如何改變了控制項的開發?
在 .NET 中的控制項開發已經和 Visual Basic 6.0 大相徑庭。其根本原因,就是 .NET 引入了繼承性。在 Visual Basic 6.0 中,你只能不用控制項或者直接引用現成的控制項來實現各種功能性。例如:為了創建前面提到的自訂文本輸入框,你就要新建一個 ActiveX 控制項,然後向其中增加一個 TextBox 。
注意 人們通常把這種程式設計思路稱為“容器” (containment) 或者“委託” (delegation)。在 Visual Basic 6.0 中,用於類比繼承機制的非控制項類也可以採用這種思路。
此時,新建的 ActiveX 控制項並不會如你所願自動獲得 TextBox 的某些屬性 (比如 Text 屬性);這些屬性只能由你編碼實現。更糟的是,你必須用許多代碼來確保 TextBox 始終佔據整個表單;你還得為新控制項設計 resizing 事件處理常式。當然,經過一番折騰,你總會完成該控制項的設計任務的,何況還有 ActiveX 控制項介面嚮導 ( Visual Basic 6.0 附加程式之一,如圖 1 所示) 能減輕你的負擔。可是在 .NET 環境下,整個任務的完成思路都會變得完全不同。

圖 1. Visual Basic 6.0 提供了一個附加程式 (add-in) ,它能自動添加和映射控制項屬性,以簡化控制項的開發。
繼承性能避免控制項開發中的某些重複代碼,因為它能讓 .NET 控制項直接獲得任何其它控制項的功能性。例如:為了創建自己的 TextBox 控制項,你可以繼承現有的 TextBox 控制項,而不是 UserControl 控制項。新控制項繼承了基類控制項的全部功能性,因此你只需要對基類控制項中沒有的功能性編碼即可。下面舉一個實際的例子。以下代碼能夠創建一個自訂 TextBox 控制項,它只允許使用者輸入數位字元:
注意 為了運行這段代碼,你只需在“Windows 應用程式”範本下新建一個 Visual Basic .NET 項目,然後就能在 IDE 自動生成的空白表單中試驗新控制項了。在專案中新建一個類 NumericTextBox ,用下面的代碼替換 NumericTextBox 類檔的內容,編譯該專案。最後,在功能表中選擇工具->自訂工具箱,選中先前編譯項目得到的 .exe 檔,就能把新控制項添加到工具箱了。
Public Class NumericTextBox
Inherits System.Windows.Forms.TextBox
Protected Overrides Sub OnKeyPress(ByVal e As _
System.Windows.Forms.KeyPressEventArgs)
If Not Char.IsDigit(e.KeyChar) Then
e.Handled = True
Else
e.Handled = False
End If
End Sub
End Class
對本例來說,以上代碼已經足夠了。如果你還覺得它不夠完善的話,請改用下列代碼,它運用一種奇妙的布林邏輯減少了代碼行數:
Public Class NumericTextBox
Inherits System.Windows.Forms.TextBox
Protected Overrides Sub OnKeyPress(ByVal e As _
System.Windows.Forms.KeyPressEventArgs)
e.Handled = Not Char.IsDigit(e.KeyChar)
End Sub
End Class
現在,你的新控制項已經正確顯示在表單中了。它象 TextBox 一樣處理事件,並且擁有與 TextBox 一樣的方法、屬性。你甚至不需更多的編碼就能實現對新控制項的資料綁定,因為這也是基類控制項 TextBox 的功能性之一。
注意 本控制項對使用者輸入的要求十分苛刻:它只允許輸入 0 至 9 的數位,也就是說,數位中的逗號、小數點甚至負號都是非法字元。我將在下一篇文章中介紹一個功能更強的輸入驗證程式。
在 Visual Basic 6.0 中設計本控制項時,核心代碼會和本範例一樣長,可是用於處理控制項的 resizing 事件和實現 TextBox 元件屬性的代碼也會有這麼長。由此可見,.NET 提供的繼承性能夠大大精簡原始程式碼。單憑這一點,.NET 就已經令人嘆服了,何況它還有許多其它優越性。更奇妙的是,凡是要求使用某一控制項的地方,都能改用繼承該控制項而來的新控制項。例如:在任何常式中要求 TextBox 的地方都能用你的 NumericTextBox 控制項。不僅如此,從現有控制項,而不是從 UserControl 類繼承而來的新控制項,不但具備基類控制項的所有功能性,還能象基類控制項一樣使用繼承得到的屬性、方法和事件。因此,任何程式師只要學過標準的 TextBox 控制項,就知道如何使用 NumericTextBox 控制項。允許繼承現有的類/控制項,是從Visual Basic 6.0 到 .NET 的一個重大飛躍,可是 .NET 的優點又何止於此!只要你認真學習本系列文章所提供的範例,你就會發現,在 .NET 環境下Windows 表單控制項不但擁有不少強大的功能,而且它們的創建也比在老版本 Visual Basic 中容易得多。
總結
無論對於個人、開發小組,還是軟體發展商,自訂控制項的開發都是功能最強大的元件技術之一。眾所周知,把使用者介面與功能性以套裝軟體的形式進行發佈,始終是Visual Basic 等視覺化開發工具立於不敗之地的重要因素;在新版的視覺化工具裡仍然延續著該理念。到了 .NET 時代,控制項的開發思路已經大不相同了,比如:它引入了繼承等新特性。好在這些新特性都是對程式師有利的,因為它們有效地減少了人們的編碼負擔,進而簡化了自訂控制項的創建過程。本文以若干控制項為例向讀者介紹了自訂控制項的創建過程,以及控制項開發中的某些重要技術。當然,我還希望讀者能從這些範例中學會如何創建自己的新控制項。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

小黑屋|Archiver|手機版|InPowerS.Net

GMT+8, 2024-4-20 02:40

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表