#E6E6E6 【VB 控件】ExtraTab 模擬 SSTab 或 TabStrip 頁籤控件 作者:吳文成

  等我把這些瑣事,這些短期計劃中的軟體( ExtraRecord 與 ExtraMp3
給寫完,我便要進一步地談談編程領域的重要著作,以及系統設計、軟體工程與理論計算機科學(可計算性理論、算法設計與分析、形式語言等等)相關的主題。某些哲學性格,使得我想要深入研究以上那些議題,可是擺在我面前的,還有更多令我感興趣的事物,所以,時間對我而言是非常寶貴的!許多事物都值得獻身追尋,所謂「後參溈山,遂登堂奧」。[[img src=computer/ExtraSpectrum.gif height=419 width=378 align=right]]

  在上個禮拜,寫完 ExtraSpectrum
,它是用作聲音即時擷取,以及聲音波譜、波形、頻率與強度的分析(另篇文章我再來深談
這些原理)
,將來ExtraRecord 等等音頻相關的軟體都會引入上述的編程
。ExtraSpectrum 使用了 tabctl32.ocx 裡的 SSTab 頁籤控件,這類控件可以作出分頁式的功能選項(也就是讓程式設計者在對話方塊的相同區域上定義多個頁面),如果不使用 SSTab,還可以使用封裝在 mscomctl.ocx 裡類似的頁籤控件 TabStrip,但是如果使用 TabStrip,整個軟體部署(也就是散發應用程式)便需要多出 1042 KB,而使用 SSTab 也要多出 205 KB。含完整功能設定的 ExtraSpectrum 本身不到 140 KB,如果因為使用頁籤控件而暴漲 1 到 8 倍,似乎有點不經濟。自己寫頁籤控件是最好的辦法,不但可以自訂適合自己的頁籤功能,也可以不必另外部署其它的 ActiveX Control 檔案——亦即,希望符合奧坎剃刀式的經濟原則。

  模擬 SSTab 與 TabStrip 這類頁籤控件的 ExtraTab 因而誕生。它可以寫得很複雜,包括頁籤的不同樣式(Style)與不同顯示方向(TabOrientation
,它也可以只寫單一樣式、單一顯示方向,由於我只要頁籤顯示在頂端(OrientationTop)即可[[img src=computer/ExtraTab.gif height=439 width=298 align=left]],所以簡易版的 ExtraTab 程式碼只要 14 KB,可說是精小實用。三種頁籤控件的比較如左圖所示,ExtraTab 在外觀上是其他兩種控件的合體
,在細節上它也改成符合我的要求,例如我不喜歡選定頁籤之後,所有的頁籤位置還要交換排序,另外,我希望非選定的頁籤標題可以灰階顯示。

  促使我必須寫 ExtraTab 控件的原因,除了是將來我的軟體設計幾乎都需要用到頁籤控件之外,原因還包括,某個不知名的因素會導致軟體目錄下的 ActiveX Control( 例如外加 tabctl32.ocx)會產生以下的錯誤訊息: Runtime Error 7 : Out of Memory 。 其實我並沒有遇過這種錯誤訊息,可是有一個網友寫信反應(使用 SSTab 的
ExtraCut 有這個問題( 這應該是極少見的情況,每個人的作業系統都有其自訂內存,別人出現的錯誤,可能不會重現在其他人的電腦裡)。以上的這些情況,一勞永逸解決的方法,顯然就是自己寫個(專案內含的使用者控制項的)頁籤控件, ExtraCut 下次改版便會採用這幾天新寫出來的 ExtraTab。當然,以後新寫的軟體也是如是作。

   與我最近寫的 FlatButton 或 ExtraButton 相比較,我在更短的時間內便寫完了 ExtraTab,如果早知道它並沒有想像中困難(所以我之前的評估失誤), 在寫 ExtraCut 之前,我就會先寫 ExtraTab,可以省掉日後要改用頁籤控件的麻煩。ExtraTab 有四個重要屬性:Tabs、TabsPerRow、TabNow、TabCaption 等等。它有三個設計主要考量點,一個是當 Tabs(頁籤的總計數目 )與 TabsPerRow( 每一列的頁籤數目 )改變時,頂端頁籤的空間排列如何重新計算,一個是每個頁籤的外框要如何繪製,一個是如何處理每個頁籤的收納器問題——這是頁籤控件最重要的部分。實際上每個頁籤主體就是一個 PictureBox 控件 ,它是最佳的受納器(Container)與圖形繪製/顯示物件。頁籤的切換,實際上就是不同的相對應的 PictureBox 的切換(Change their ZOrder〔疊置順序〕)。當然,ExtraTab 在收納器的問題不僅於此,最困難的問題是在於: UserControl 的 ContainedControls 在 VB 裡
, 不能改變其收納器到 UserControl 內置的其它 PictureBox 上 , 這個問題是無法排除的, 變通的方法只有藉助表單上的其它獨立 PictureBox,再把它們聯合當作(假裝作)ExtraTab 的內置頁籤,所以原本的難題便轉變為
:如何讓 ExtraTab 與外在的獨立 PictureBox 們有一致的方位與一致的「行動」?——這個問題是比較簡單處理的,一切都是相對於使用者的視覺效果的「製作」罷了。在這裡,我想要強調的是:「問題的類比與轉化」對於程式設計者來說,是一個非常重要的經驗!

範例源碼下載

控制項下載
2005/10/31