第20章 使用ActiveX控件
使用標(biāo)準(zhǔn)控件可設(shè)計(jì)出大多數(shù)的用戶界面,但對(duì)一些特定的需求仍很難滿足。這時(shí)可使用其他程序設(shè)計(jì)語言構(gòu)臺(tái)非標(biāo)準(zhǔn)ActiveX控件來彌補(bǔ)標(biāo)準(zhǔn)控件的不足。
20.1 添加ActiveX控件
使用ActiveX控件之前,需要先將ActiveX控件的圖標(biāo)添加到工具箱中。在工具箱中加入ActiveX控件后,它將成為開發(fā)和運(yùn)行環(huán)境的一部分,并為應(yīng)用程序提供新的功能。使用ActiveX控件的方法與使用其他標(biāo)準(zhǔn)控件的方法完全一樣。ActiveX控件保留了其他標(biāo)準(zhǔn)控件的一些常用屬性、方法和事件,它們的作用也相同,這樣就保證了VBA程序的基本能力。下面以“ImageList控件”為例演示將Ac
tiveX控件添加到工具箱中的方法。
步驟1 在Excel中組合鍵“Alt+F11”切換到VBE環(huán)境中。
步驟2 選擇菜單中的“插入”“用戶窗體”命令,插入一個(gè)用戶窗體,同時(shí)顯示出工具箱。
步驟3 在“工具箱”的空白位置單擊鼠標(biāo)右鍵,將彈出如圖20-1所示的菜單。
步驟4 單擊彈出菜單中的“附加控件”項(xiàng),打開如圖20-2所示“附加控件”對(duì)話框。
步驟5 在“可用控件”列表框中找到“Microsoft ImageList Control6.0”選項(xiàng),并單擊其前面的復(fù)選框,確認(rèn)其為被選中狀態(tài),如圖20-3所示。
步驟6 單擊“確定”按鈕后,工具箱中將新增加“ImageList控件”,如圖20-4所示。
步驟7 將ActiveX控件添加到工具箱中以后,可以使用與標(biāo)準(zhǔn)控件一樣的方法,向窗體中添加該圖像列表控件。
注意:使用ActiveX控件之前,要保證該控件已安裝在計(jì)算機(jī)中,如前面添加的ImageList控件是在MSCOMCTL.OCX文件中定義的,必須將該文件復(fù)制到Windows的system32文件夾中,程序才能正常運(yùn)行。
20.2 使用圖像列表控件
圖像列表控件(ImageList)像是圖像的儲(chǔ)藏室,可用來保存窗體中要用到的圖像。在程序運(yùn)行時(shí)ImageList控件是隱藏的,其他控件可通過索引調(diào)用ImageList控件中保存的圖像。
20.2.1 ImageList的構(gòu)成
ImageList控件包含在MSCOMCTL.OCX文件中,使用之前必須先將其附加到工具箱中,如上一節(jié)所示。
ImageList控件包含一個(gè)ListImages集合,該集合由ListImage對(duì)象構(gòu)成。ListImage對(duì)象是任意大小的圖片,可以被其他控件使用。圖片可以是位圖(.bmp)、光標(biāo)(.cur)、圖標(biāo)(.ico)、JPEG(.jpg)或(.gif)文件。
ImageList控件中儲(chǔ)存的圖像可以被其他控件使用,特別是ListView,TreeView和TabStrip控件。如果某個(gè)控件將Picture對(duì)象分配給它的Picture屬性,那么這樣的控件就可以和ImageList控件一起使用,例如Image控件、按鈕控件及單選按鈕控件等。
用ImageList控件存儲(chǔ)圖像可以節(jié)約程序的開發(fā)時(shí)間,因?yàn)檫@樣可以使編寫的代碼引用單一和一致的圖像目錄。不用在每次顯示圖片時(shí)都使用LoadPcture函數(shù)從磁盤上裝載圖片,只需要使用一次LoadPicture圖片填充到ImageList控件,并分配其引用句Key值,在后續(xù)的代碼中就可以根據(jù)Key或Index屬性引用ImageList控件中存儲(chǔ)的圖像。
20.2.2 ImageList屬性和方法
從如圖20-5所示的對(duì)象瀏覽器中可以看出,作為圖像的存儲(chǔ)控件,ImageList控件的成員很少,主要有以下幾個(gè)。
1. ImageHeight屬性
ImageHeight屬性返回或設(shè)置圖像列表控件中ListImage對(duì)象(圖片)的高度。
2. ImageWidth屬性
ImageWidth屬性返回或設(shè)置圖像列表控件中ListImage對(duì)象(圖片)的寬度。
3. ListImages屬性
返回對(duì)圖像列表控件中ListImage對(duì)象集合的引用。
可以用標(biāo)準(zhǔn)的集合方法(如Add和Clear方法)來操作ListImage對(duì)象。集合中的每一個(gè)成員都是可以通過其索引或唯一關(guān)鍵字來訪問。當(dāng)把ListImage對(duì)象添加到一個(gè)集合中時(shí),這些索引或唯一關(guān)鍵字被分別存儲(chǔ)在Index和Key屬性中。
4. Overlay方法
使用Overlay方法可以創(chuàng)建組合圖像,該是組合圖像從一個(gè)ListImages集合繪制一幅圖像,疊加在另一幅上面。其語法為:
object.Overlay (index1, index2)
其中,參數(shù)的含義如下。
●index1:一個(gè)整數(shù)(ListImages集合對(duì)象的Index屬性)或唯一的字符串(ListImages集合對(duì)象的Key屬性),它指定了將被疊加的圖像。
●index2:它指定了將被繪制到由index1指定對(duì)象上的圖像。
20.2.3 添加圖像到ImageList控件
有兩種方法將圖像添加到ImageList控件中,一種是在程序中編寫代碼,使用ListImages集合對(duì)象的Add方法將圖像添加到該集合中,其操作方法與其他集合對(duì)象相同;另一種是使用可視的方法,在設(shè)計(jì)階段將圖像載入控件中。具體操作步驟如下。
步驟1 在如圖20-6所示的ImageList控件的“屬性”窗口中單擊“(自定義)”項(xiàng)后的
按鈕,打開“屬性項(xiàng)”,如圖20-7所示。
步驟2 在“General”選項(xiàng)卡中可設(shè)置圖像的大小等參數(shù)。
步驟3 單擊“Images”選項(xiàng)卡,打開如圖20-8所示對(duì)話框。
步驟4 單擊下方的“InsertPicture”按鈕,打開“SelectPicture”對(duì)話框,選擇需要添加到ImageList控件的ListImages集合中的圖像(可一次選中多個(gè)圖像文件),再單擊“打開”按鈕即可。
20.2.4 改進(jìn)的紅綠燈窗體
在上一章用Image控件做了一個(gè)紅綠燈程序,為了顯示三種狀態(tài),使用了三個(gè)Image控件。如果使用ImageList控件作為容器,則放置三種狀態(tài)的圖片,然后使用一個(gè)Image控件分別顯示即可,具體制作步驟如下。
步驟1 在VBE環(huán)境中選擇菜單中的“插入”“用戶窗體”命令插入一個(gè)窗體。
步驟2 向工具箱中添加ImageList控件。
步驟3 向窗體中添加兩個(gè)按鈕控件、一個(gè)圖像控件、一個(gè)ImageList控件,其參數(shù)設(shè)置參照19章的例子,ImageList控件在運(yùn)行時(shí)不會(huì)顯示,可將其隨意放置在窗體中,如圖20-10所示。
在窗體初始化時(shí),將信號(hào)燈三種狀態(tài)的圖片都添加到ImageList控件中,并設(shè)置好Key屬性供后續(xù)程序調(diào)用。設(shè)置完ImageList控件中的圖片后,在圖像控件中顯示紅燈狀態(tài),并設(shè)置標(biāo)志變量isignal的值。
步驟6 給“切換信號(hào)”按鈕編寫代碼如下:
Private Sub cmdSwitch_Click()
iSignal = iSignal Mod 3
Select Case iSignal
Case 0
img1.Picture = ImageList1.ListImages("red").Picture
iSignal = iSignal + 1
Case 1
img1.Picture = ImageList1.ListImages("yellow").Picture
iSignal = iSignal + 1
Case 2
img1.Picture = ImageList1.ListImages("green").Picture
iSignal = iSignal + 1
End Select
End Sub
程序中根據(jù)標(biāo)志變量iSignal的值來決定應(yīng)該顯示哪張圖片,顯示完成后標(biāo)志變量加1.在本例中只使用了一個(gè)圖像控件,通過更換圖像控件中的Picture屬性值來達(dá)到改變顯示效果的目的。
20.3 使用樹形視圖控件
TreeView控件可以用來顯示具有層次結(jié)構(gòu)的數(shù)據(jù),例如組織樹、索引項(xiàng)、磁盤中的文件和目錄等。如同Windows資源管理器中顯示的文件和文件夾一樣,該控件可以逐級(jí)向下顯示,也可將下級(jí)項(xiàng)目折疊起來。TreeView控件中的各項(xiàng)信息都有一個(gè)與之相關(guān)聯(lián)的Node對(duì)象。
20.3.1 TreeView的構(gòu)成