#E6E6E6 【VB 控件】HSBar 演示捲軸與其他控件的組合 作者:吳文成

  有些物件的開發是因為創意或靈感的驅使,它可能不強調多重執行個體的使用 ,也可能不傾向於多介面的引用,例如之前介紹的 FadeCircle 物件類別,它提供較單純的屬性與方法,通常只用一個執行個體以呈現色彩[[img src=computer/FlatButton.gif height=99 width=234 align=left]]漸變的模擬。但是有些物件被開發的目的,在於其實用性與可重複性,例如使用 FlatButton( 由我所開發的平面按鈕控制項)的應用程式,通常不會只使用一個 FlatButton , 它們是針對按鈕的特定視覺效果而被封裝的物件(雖然它們表現成類似的視覺效果,可是它們被指派於不同的表徵功能),它們需要解決反復的問題,需要有各自的執行緒,以及友善的使用者介面,以達到其實用性與可重複性的要求。

  再舉一個例子,來說明為什麼需要封裝特定的屬性與方法(我們稱之為「介面」), 以成為重複性使用的物件。HScrollBar 捲軸控制項的數值屬性只支援正整數的資料型態,如果我們需要使用 Single( 單精度[[img src=computer/HScrollBar.gif height=59 width=151 align=right]]浮點數
,例如小數或負數)資料型態就必須轉換數值系統
。對於一般使用者來說,寫數學轉換函數實在是太過傷腦筋了,如果有人可以直接製作一個支援所有數值型態的捲軸控制項,那一定是大受歡迎,它可以運用在負角度的數值與更精確的秒數數值。我早期的編程研究集中在複雜的幾何圖形模擬,例[[img src=computer/Curve3D.gif height=259 width=314 align=left]]如左圖演示一個三維曲線的消隱面(相對於你的視角,是否發現曲面相互遮蔽的部分並未繪出?)演算法。在許多類似的程式裡,我需要改變不同方向的視角與視距以測試演算法,這些數值顯然有負數與小數,被使用的這些捲軸物件必須要能夠反映這些數值型態才行。在實用性與可重複性的要求下,我必須製作與封裝特定屬性與方法的捲軸物件才行。於是, 你看到圖示上方有三個 HSBar 控制項 , 此物件實現了兩個數值系統的轉換,可以指定捲軸最大值與最小值,以及數值的變動單位(最小梯度
,即 ValueStep ), 假如捲軸範圍在 -2.5 到 2.5 之間 ,ValueStep=0.5 的話
,那麼數值序列即為 -2.5、-2.0、-1.5 …… 2.0、2.5。它具有數值圓整化的功能,例如你「 輸入 」數值 -2.1234, HSBar 會自動把這個不符合最小梯度的數值圓整化成 -2.0。等等!「輸入」是什麼意思?我在設計 HSBar 控制項的時候,左邊的小方框除了可以顯示即時的數值,還可以讓使用者在方框內輸入任意數值。這樣的功能(介面)是我所需要的。

  你可能也注意到控件上方有標題文字。是的,HSBar 捲軸控件組合了其他幾個基本控件,包括 Label、TextBox 與 PictureBox 等等,在考慮友善的使用者介面下,它的功能涵蓋了數值轉換、文字標註與數值輸入,正是因為這些功能的封裝能夠滿足我的大量實際需求,所以這是我最主要使用的自製控件。如果使用者不使用文字標註與數值顯示(暨輸入)方框,那麼 HSBar 控件的外觀便會與 HScrollBar 捲軸控件一模一樣,但是前者能夠接受更多的數值資料型態與數值單位,為了多兼顧使用者對於外觀的不同需求(可見我很友善 …… ), 所以 HSBar 允許使用者選擇不顯示文字標註「或」數值方框。在其他外觀屬性上,它也可以改變文字字型的各屬性
,以及背景顏色。除了與物件類別一樣必須界定功能、編碼資料、宣告屬性與方法之外,製作具有實體外觀的控制項,還必須考慮到:屬性值從控件儲存袋(PropertyBag)的讀取與寫回(ReadProperties and WriteProperties
,這牽涉到控件屬性資料的永久保持),以及合理地安排控件屬性的使用者介面。如果這個控件乃是數個實體元件的組合,那麼我們還需要考慮:當控件 Show 或者 Resize 的時候,這些內部元件的位置大小該如何調整。

  以 HSBar 控件為例 , 調整內部元件的最適大小與相對位置是重要的程序 , 這有兩個部分:一個是當控件改變大小,文字標註( lblCaption)
、數值方框(txtValue)與主要捲軸(hsbMain)都需要視情況調整大小位置(如果還考慮到不顯示文字標註或數值方框,那麼情況會再複雜些);另一個部分是當 ValueStep 屬性改變 ,也會改變數值表示的格式( 例如當 ValueStep=2,那麼捲軸數值可能是 4,但是當 ValueStep=0.2, 那麼捲軸數值可能是 -0.4,這時候數值表示就會多出小數位),這會直接影響到數值方塊的最適寬度與最適字型大小,這一改變又會間接影響主要捲軸的位置大小。由此可見,對於具有實體外觀的控制項,調整內部元件的最適大小與相對位置 , 有時是設計者傷腦筋的問題( 設計者必須判斷引發 Resize 的事件來源、其效應主要影響者與次要影響者,以及在這些影響下,其他屬性的相應變化)。然而這些問題只是實體外觀的層次。

  在不同的層次上,控件的功能性規劃是核心的部分,設計者通常會先考慮控件的功能(要解決什麼問題?),然後再考慮它需要外顯哪些屬性與方法 , 然後再考慮各元件在實體上的呈現模式與空間關係 。 以 HSBar 控件為例,數值系統的轉換顯然就是其核心功能與它首先要解決的問題,如何把正整數系「一對一映射到」有理數系(把正整數的捲軸升級成單精度浮點數的捲軸),例如 1 對應到 0.3、2 對應到 0.6、3 對應到 0.9,關鍵在於被對應者的 ValueStep=0.3, 在基準點為 0( 即線性關係經過 0)的情形下,對應倍數顯然也是 0.3, 如果基準點不為 0 , 我們只要「平移」被對應者的數值系統即可。解決了上述的數值轉換問題,其他的考慮便是數值邊界的問題,我就不再深談。其實剛剛談到的算是簡單的數值轉換問題
,數值系統轉換還有不同的案例,包括如何把某個物件的座標系統改成另一個物件的座標系統(例如滑鼠的螢幕位置轉換成它正位處的表單的座標位置 ),但是以下這個例子,如何把 RGB 色彩屬性對應到 HSB( HSV)色彩屬性,就不是一對一的映射關係,所以這是比較複雜的案例。

  好像在寫教科書教材,我只是希望藉由一個個例好好地剖析不同層面
, 在這裡 HSBar 控件是一個很好的範例 , 能夠讓我藉以闡述好幾個相關要點與原理。程式碼與控件列舉在文末,希望這是一個受歡迎的控件。

範例源碼下載

控制項下載
2004/11/08