菜單和工具欄
建立有用的自定義應(yīng)用程序的基本原則之一是提供用戶與Visual Basic應(yīng)用程序之間簡潔一致的交互方式。菜單和工具欄為向用戶顯示簡單的命令和選項(xiàng)提供了快捷、方便,而且被廣泛接受的方式。在Microsoft Office 中,很容易對(duì)菜單和工具欄進(jìn)行設(shè)計(jì)和修改;Microsoft Excel 采用了統(tǒng)一的自定義化的界面-“自定義”對(duì)話框。因?yàn)樗械牟藛魏凸ぞ邫诙加猛瑯宇愋偷念悂肀硎荆瑿ommandBar 對(duì)象-所以也很容易從Visual Basic中來定義和控制它們。
修改用戶界面的工具
有兩種自定義菜單欄和工具欄的工具:共享“自定義”對(duì)話框和Visual Basic。雖然,在每個(gè)Office應(yīng)用程序之間,“自定義”對(duì)話框仍有很小的區(qū)別,但是用于修改菜單欄和工具欄的可編程對(duì)象在所有的應(yīng)用程序中都是相同的。本節(jié)講述了“自定義”對(duì)話框和共享可編程對(duì)象,以及何時(shí)和怎樣使用這些工具。
“自定義”對(duì)話框
本章的這一節(jié)討論怎樣使用“自定義”對(duì)話框和Visual Basic代碼來修改菜單欄和工具欄。在兩種技術(shù)都可作同樣修改的場合下,使用“自定義”對(duì)話框能更快和更容易地完成設(shè)計(jì)時(shí)刻更改。
顯示“自定義”對(duì)話框
在“視圖”菜單里,指到“工具欄”,然后單擊“自定義”。
Microsoft Excel在“自定義”對(duì)話框(含“工具欄”表,“命令”表和“選項(xiàng)”表)中提供了相同的控件,但是前三種應(yīng)用軟件還在“工具欄”表和“命令”表中包含了其他一些元素,專門用于這些軟件本身的自定義。這些元素將在下面的段落中進(jìn)行介紹。
Microsoft Excel “工具欄”表包含一個(gè)“附加”按鈕,用來顯示“附加工具欄”對(duì)話框。用戶可以用這個(gè)對(duì)話框把菜單欄從應(yīng)用程序的工作區(qū)拷貝到活動(dòng)工作區(qū)。要作更多的了解,請參考本章后面“用戶界面的更改范圍”一節(jié)的內(nèi)容。
當(dāng)用戶在任何Microsoft Office 應(yīng)用程序中打開“自定義”對(duì)話框后,就可以按同樣的步驟來修改任何內(nèi)置或自定義的菜單和工具欄,步驟如下。
在“工具欄”對(duì)話框的“工具欄”一表中,用戶可以選擇出要顯示和修改的菜單欄或工具欄,在它們的名字前面的復(fù)選框里打上鉤。新創(chuàng)建的菜單欄或工具欄會(huì)自動(dòng)顯示出來。
單擊任何一個(gè)菜單項(xiàng)(包括菜單和子菜單的標(biāo)題)或者是工具欄控件,把它選中。當(dāng)打開“自定義”對(duì)話框的時(shí)候,和控件相關(guān)聯(lián)的命令是不能運(yùn)行的。
在選定的項(xiàng)或控件上按下鼠標(biāo)右鍵,顯示出快捷菜單,該菜單中包含了可使用的自定義選項(xiàng)。菜單命令和工具欄按鈕的選項(xiàng)包括重新設(shè)置命令;刪除項(xiàng)或控件;更改它的名字;指出它是否有名字及圖標(biāo),或是兩者都有;修改它的圖標(biāo);以及設(shè)置它開始一組 (也就是說,在它的上方或下方有一條線)。
注釋 某些內(nèi)置的命令或控件不能使用這些選項(xiàng)中的一種或幾種;在快捷菜單上不能使用的選項(xiàng)將變成陰暗顯示。
當(dāng)“自定義”對(duì)話框打開時(shí),用戶可以通過拖放來重新安排項(xiàng)和控件的順序,還可以從“命令”表里添加新的項(xiàng)和控件。要做更多的了解,請參考本章后面“菜單系統(tǒng)的設(shè)計(jì)時(shí)刻修改”以及“工具欄的設(shè)計(jì)時(shí)刻修改”兩節(jié)里的有關(guān)步驟。
Visual Basic
通常,要?jiǎng)?chuàng)建或修改引進(jìn)了Visual Basic程序的Microsoft Office應(yīng)用程序的用戶界面,應(yīng)當(dāng)使用“自定義”對(duì)話框。用戶通過“自定義”對(duì)話框?qū)τ脩艚缑嫠龅母慕凶鲈O(shè)計(jì)時(shí)刻更改。
用戶也可以在Visual Basic代碼中使用共享的Microsoft Office對(duì)象模型的命令欄部分,以此來添加和修改菜單及工具欄:高級(jí)對(duì)象是CommandBars集合,在所有的Microsoft Office應(yīng)用程序中由CommandBars屬性返回。每一個(gè)菜單欄、快捷鍵菜單,以及工具欄都可以用該集合中的某個(gè)CommandBar對(duì)象來表示。每一個(gè)CommandBar對(duì)象包括一個(gè)CommandBarControls集合;在菜單欄或工具欄上的每個(gè)控件都可以用幾個(gè)這樣的集合來表示。
要了解有關(guān)CommandBars集合、它所包含的所有對(duì)象,以及這些對(duì)象的屬性和方法的更多內(nèi)容,請參考“命令欄概述”和“幫助”中相應(yīng)的對(duì)象、屬性和方法主題。
用戶也可以編寫代碼,運(yùn)行一次就能創(chuàng)建或更改菜單欄或工具欄的元素;實(shí)際上,這些代碼模擬了在“自定義”對(duì)話框中所進(jìn)行的設(shè)計(jì)時(shí)刻更改。但是在某些Microsoft Office應(yīng)用程序中,可能要求用戶將這類Visual Basic 代碼和“自定義”對(duì)話框組合起來去設(shè)計(jì)Visual Basic應(yīng)用程序。在以下一些常見場合,用戶必須使用代碼和容器應(yīng)用程序界面的組合:
如果用戶不能使用“自定義”對(duì)話框來創(chuàng)建一個(gè)新的菜單欄時(shí),就需要使用Visual Basic來完成創(chuàng)建菜單欄的任務(wù)。在Visual Basic中建好菜單欄后,可以使用“自定義”對(duì)話框來設(shè)計(jì)該菜單欄中的各個(gè)菜單。
如果用戶的容器應(yīng)用程序不能在“自定義”對(duì)話框打開時(shí),顯示內(nèi)置或自定義的快捷菜單,用戶必須使用Visual Basic代碼去修改這些快捷菜單。
如果用戶的容器應(yīng)用程序不能提供用于在工具欄上添加或修改文本框、下拉式列表框,或者組合框時(shí),用戶必須使用Visual Basic 代碼來添加和設(shè)計(jì)這些控件。
用戶也可以編寫存在于Visual Basic應(yīng)用程序中的代碼,該應(yīng)用程序在運(yùn)行時(shí)對(duì)菜單系統(tǒng)進(jìn)行修改(例如,用戶可以編寫在某種條件下禁用某菜單中的某一命令的代碼,或者根據(jù)用戶的動(dòng)作給某個(gè)菜單欄添加一個(gè)菜單)。在用戶的Visual Basic 應(yīng)用程序運(yùn)行時(shí),用戶代碼產(chǎn)生的更改叫做運(yùn)行時(shí)刻更改。
用戶界面的更改范圍
關(guān)于在何處對(duì)用戶界面進(jìn)行更改以及怎樣存儲(chǔ)更改,每一個(gè)Microsoft Office應(yīng)用程序使用略微不同的規(guī)則。理解怎樣才能控制更改的范圍是非常重要的,因?yàn)樗鼪Q定了用戶的Visual Basic 應(yīng)用程序顯示用戶自定義界面的能力。
可以通過三種方法,在用戶自定義的應(yīng)用程序中使用自定義菜單欄和快捷菜單:
用戶可以把自定義工具欄和工作區(qū)或工作簿一起保存。當(dāng)用戶從Microsoft Excel退出時(shí),在工作區(qū)中的工具欄會(huì)自動(dòng)地保存在文件Username8.xlb中(其中的“Username”是Windows95當(dāng)前登錄的用戶名)。如果用戶沒有登錄,文件存為Excel8.xlb。在工作簿里的工具欄保存在工作簿文件中。
工作簿級(jí)的菜單欄和工具欄使用戶能夠方便地為自定義的應(yīng)用程序(例如,一個(gè)加載應(yīng)用程序)創(chuàng)建一個(gè)美觀的用戶界面、分配自定義工具欄按鈕和它們支持的過程。如果用戶打算分配帶有一個(gè)自定義應(yīng)用程序的自定義工具欄,就應(yīng)該把該工具欄附加到包含那個(gè)應(yīng)用程序的工作簿上,使得工具欄和應(yīng)用程序那個(gè)保存在同一個(gè)文件里。
將菜單欄或工具欄從工作區(qū)移動(dòng)到工作簿
如果“自定義”對(duì)話框尚未打開,那么用鼠標(biāo)指到“視圖”菜單里的“工具欄”上,然后單擊“自定義”。
在“工具欄”表上單擊“附加”按鈕。
顯示出“附加工具欄”對(duì)話框。
在“自定義”對(duì)話框里,單擊想要復(fù)制到活動(dòng)工作簿的菜單欄或工具欄的名字。
單擊“復(fù)制”。
所復(fù)制的菜單欄或工具欄的名字就出現(xiàn)在工作簿框中。
用戶可以刪除原始的工作區(qū)級(jí)的菜單欄或工具欄,單擊“自定義”對(duì)話框中的“工具欄”表,選擇要?jiǎng)h除的菜單欄或工具欄的名字,然后單擊“刪除”按鈕。如果用戶沒有刪除菜單欄或工具欄在工作區(qū)的版本,還可以對(duì)其進(jìn)行更改而不會(huì)影響到工作簿中保存的版本。如果用戶對(duì)工作區(qū)中的菜單欄或工具欄進(jìn)行了更改,而且想更新工作簿中的版本使它同工作區(qū)的版本保持一致,可以再次將工作區(qū)中的版本復(fù)制到工作簿里,替換工作簿原來的版本。
把菜單欄或工具欄復(fù)制到工作簿之后,該菜單欄或工具欄只有在用戶打開工作簿之后才可以使用。菜單欄或工具欄在工作簿中的版本不但保留著它們的名字和內(nèi)容,而且還保留著為菜單項(xiàng)或工具欄控件指定的代碼;菜單欄或工具欄的位置、大小以及形狀;它在屏幕上的顯示位置;和它是處于顯示狀態(tài)還是隱藏狀態(tài)。
用戶也可以刪除菜單欄或工具欄的工作簿版本。
刪除菜單欄或工具欄的工作簿版本
如果“自定義”對(duì)話框尚未打開,用鼠標(biāo)指到“視圖”菜單下的“工具欄”上,然后單擊“自定義”。
在“工具欄”表上,單擊“附加”按鈕。
顯示出“附加工具欄”對(duì)話框。
在工作簿框的“工具欄”內(nèi),單擊想刪除的菜單欄或工具欄的名字。
單擊“刪除”按鈕。
注釋 不能使用Visual Basic把菜單欄或工具欄附加到工作簿上或是從工作簿中把它們刪除。
當(dāng)用戶打開包含一個(gè)或多個(gè)菜單欄或工具欄的工作簿時(shí),Microsoft Excel 首先判斷是否已經(jīng)存在有一個(gè)同名的工作區(qū)菜單欄或工具欄。如果不存在,Microsoft Excel會(huì)創(chuàng)建一個(gè)新的工作區(qū)菜單欄或工具欄,并且把在工作簿里的版本復(fù)制過來。這樣一來,用戶得到了菜單欄或工具欄的最新副本,用戶可以作許多變動(dòng):隱藏它,或者從工作簿級(jí)的副本那兒復(fù)制菜單項(xiàng)或控件,也可以向把菜單項(xiàng)項(xiàng)或控件復(fù)制到工作簿級(jí)的副本里去。
沒有辦法對(duì)菜單欄或工具欄進(jìn)行重命名,于是當(dāng)工作簿再次打開時(shí),工作區(qū)已經(jīng)存在著與工作簿版本同名的菜單欄或工具欄,Microsoft Excel使用工作區(qū)的副本而不是將工作簿的版本重新進(jìn)行裝載。但是,當(dāng)用戶單擊相應(yīng)的菜單項(xiàng)項(xiàng)或控件時(shí),打開的工作簿里的菜單欄或工具欄所支持的過程仍然能夠運(yùn)行。
開發(fā)人員可以設(shè)計(jì)一個(gè)菜單欄或工具欄,然后把它附加到工作簿中。當(dāng)用戶打開工作簿時(shí),就能使用該自定義菜單欄或工具欄了。用戶既可以對(duì)它進(jìn)行編輯,還能把菜單項(xiàng)項(xiàng)或控件從中移動(dòng)到個(gè)人的菜單欄或工具欄里,這都不會(huì)影響保存在工作簿里的副本。當(dāng)用戶退出Microsoft Excel時(shí),用戶更改后的菜單欄和工具欄和工作簿文件一起保存。當(dāng)用戶再次啟動(dòng)Microsoft Excel時(shí),編輯過的菜單欄或工具欄仍然可以使用;單擊一個(gè)開發(fā)人員的菜單項(xiàng)或工具欄控件可以裝載工作簿,其中包含了附加到那些菜單項(xiàng)或控件的過程。要生成新的工作簿菜單欄或工具欄,可以刪除被編輯過的副本。
選擇對(duì)用戶界面進(jìn)行最佳增強(qiáng)
菜單是用戶界面命令的列表,用戶可以從中選擇命令。菜單提供了一種方便且一致的方法對(duì)命令進(jìn)行分組,并且向用戶提供了使用它們的簡便方式。執(zhí)行相關(guān)任務(wù)的命令可以列在同一個(gè)菜單下,同時(shí)命令還可以進(jìn)行分組(用線與其他的命令或命令組分隔開)。子菜單構(gòu)成了下一級(jí)的組織結(jié)構(gòu),快捷菜單把一組相關(guān)的命令組織起來,用以完成一項(xiàng)專門的任務(wù)。
用戶能夠?yàn)槊钪付ㄔL問鍵,從而可以用鍵盤發(fā)命令,用戶還能夠?yàn)槊钪付旖萱I,從而更快地使用命令。另外,菜單比工具欄占用的空間要少,因?yàn)椴藛沃械母黜?xiàng)只有在需要使用的時(shí)候才顯示出來,并不需要在屏幕上分配專門的顯示空間。另一方面,如果用戶想快速地以圖形方式使用命令,那最好還是使用工具欄。
工具欄包含一些快捷,用來執(zhí)行被頻繁使用的命令。對(duì)表示某種特性設(shè)置(例如,加粗或傾斜格式)、可視化命令以及用鼠標(biāo)點(diǎn)擊執(zhí)行的命令來說,使用工具欄較為理想。另外,當(dāng)用戶工作時(shí),工具欄始終顯示在屏幕上,而菜單只有在使用的時(shí)候才顯示出來;在工具欄上找出某個(gè)特殊的按鈕要比在菜單欄里找出某條命令容易得多。但是,如果要方便地使用鍵盤命令,或是想顯示出命令的層次結(jié)構(gòu),抑或是可用的顯示屏幕有限,那么最好使用菜單。
如果需要演示用戶的一組復(fù)雜的選項(xiàng),那么用對(duì)話框比工具欄和菜單都要強(qiáng)。如果想在用戶正在使用的數(shù)據(jù)的附近安置工具,那么最好的解決辦法可能就是在工作表或文檔里直接安置控件了。要做進(jìn)一步詳細(xì)的了解,請參考本書的第十二章“ActiveX 控件和對(duì)話框”。
菜單系統(tǒng)
每一個(gè)Microsoft Office 應(yīng)用程序的菜單系統(tǒng)都是由完整的一套菜單以及菜單上的菜單項(xiàng)所組成的。一個(gè)菜單可以是主菜單、子菜單或是快捷菜單。一個(gè)菜單項(xiàng)通常是一條命令或是一個(gè)子菜單的標(biāo)題。在本章中,“組件”這個(gè)術(shù)語一般指任何菜單或菜單項(xiàng)。
菜單欄處在活動(dòng)窗口的頂端,它顯示出所有菜單的名稱,菜單可以隨時(shí)為應(yīng)用程序所使用。也就是說,Microsoft Office 應(yīng)用程序能夠根據(jù)一次活動(dòng)窗口的變化或一條Visual Basic指令相應(yīng)地改變菜單欄的顯示。例如,當(dāng)用戶在Microsoft Excel 中編輯圖表時(shí),包含一組用于圖表環(huán)境的菜單的菜單欄會(huì)自動(dòng)顯示出來。
一個(gè)菜單是菜單項(xiàng)的一張列表,菜單項(xiàng)在用戶單擊菜單欄上的菜單名時(shí)才出現(xiàn)(下拉)。
一個(gè)子菜單是附加在另一個(gè)菜單(父菜單)旁邊的菜單,靠近父菜單上某個(gè)子菜單標(biāo)題。每個(gè)子菜單標(biāo)題都有一個(gè)指向右邊的箭頭。用戶可以給菜單或快捷菜單添加子菜單。當(dāng)用戶用鼠標(biāo)指到父菜單上的子菜單標(biāo)題時(shí),就會(huì)顯示出相應(yīng)的子菜單。
一個(gè)快捷菜單是包含了與某個(gè)專門命令有關(guān)的一組命令的浮動(dòng)菜單。當(dāng)用戶在某個(gè)對(duì)象上點(diǎn)擊鼠標(biāo)右鍵時(shí),就會(huì)顯示出快捷菜單。
自定義菜單系統(tǒng)的原則
用戶可以通過很多途徑對(duì)Microsoft Office應(yīng)用程序的菜單系統(tǒng)進(jìn)行修改:可以創(chuàng)建新的菜單欄、在內(nèi)置或自定義菜單欄中添加新的菜單、在內(nèi)置或自定義菜單或子菜單中添加新的菜單項(xiàng),而且還可以給菜單項(xiàng)指派宏。另外,用戶也可以隨時(shí)恢復(fù)到內(nèi)置菜單系統(tǒng)的默認(rèn)狀態(tài)。
添加自定義組件或修改內(nèi)置組件
每個(gè)Microsoft Office應(yīng)用程序都帶有自己的內(nèi)置菜單系統(tǒng)。用戶可以修改它的內(nèi)置系統(tǒng),也可以創(chuàng)建和修改自定義的菜單組件。
如果用戶添加或改變了較少數(shù)目的組件,那么對(duì)菜單欄、菜單或菜單項(xiàng)進(jìn)行修改比較合適的。例如,如果用戶只是想提供一個(gè)訪問菜單的宏,那么可以在內(nèi)置菜單里添加進(jìn)一個(gè)菜單項(xiàng),然后把宏鏈接到該菜單項(xiàng)。
如果用戶需要作更大范圍的修改,最好創(chuàng)建一個(gè)新的完整組件。例如,如果用戶想添加幾個(gè)新菜單-每個(gè)都包括幾個(gè)新的菜單項(xiàng)-那么創(chuàng)建一個(gè)包含所有新菜單的全新的菜單欄會(huì)比較合適一些。
使用子菜單
如果用戶的菜單系統(tǒng)顯得擁擠而且瀏覽困難,那么可以使用子菜單來有效地組織它們,并且通過減少每個(gè)時(shí)刻顯示給用戶的信息數(shù)量來增加Visual Basic應(yīng)用程序的清晰度。例如,假定要?jiǎng)?chuàng)建一個(gè)包含了幾個(gè)選項(xiàng)的菜單,如下圖所示。
可以用下面所示的任何一種方法來使用子菜單,都能顯示出相同的菜單項(xiàng)。
通過使用子菜單,可以連續(xù)地瀏覽一系列命令,而如果使用別的方式可能只好通過一連串的對(duì)話框才能完成這些命令。但是,如果需要?jiǎng)?chuàng)建較為復(fù)雜的一系列子菜單來演示一組命令,那么對(duì)話框是更好的解決辦法。
使用快捷菜單
使用文本框、列表框和組合框
雖然可以在Visual Basic應(yīng)用程序的菜單、快捷菜單和子菜單里添加內(nèi)置或自定義文本框、列表框和組合框,但是這類控件還是用在工具欄里比較好。在某些需要顯示或返回一種簡單設(shè)置的情況下,使用菜單上的文本框會(huì)很方便。在顯示菜單的同時(shí),列表框和組合框也顯示出當(dāng)前的設(shè)置。但是,一旦用戶在框里選擇了新值,菜單也就隨之被關(guān)閉了(用戶不能查看或是修改設(shè)置,必須再次打開菜單來確認(rèn))。
如果要在菜單里添加內(nèi)置文本框、列表框和組合框,須使用與添加內(nèi)置命令相同的技術(shù)(參考本章后面的“添加命令和命令分組”一節(jié)的內(nèi)容)。如果要添加自定義文本框、列表框和組合框,須使用和把它們添加到工具欄相同的技術(shù)(參考本章后面的“工具欄的設(shè)計(jì)時(shí)刻修改”一節(jié)的內(nèi)容)。
菜單系統(tǒng)的設(shè)計(jì)時(shí)刻修改
菜單的設(shè)計(jì)時(shí)刻修改是指在應(yīng)用程序運(yùn)行前對(duì)菜單系統(tǒng)所進(jìn)行的更改。包括添加、刪除、移動(dòng)和恢復(fù)菜單組件,以及設(shè)置菜單組件在運(yùn)行時(shí)不隨條件更改而變化的屬性。
添加自定義菜單欄
使用“自定義”對(duì)話框
用戶需使用CommandBars集合的Add方法來創(chuàng)建一個(gè)新的菜單欄;Add方法中的參數(shù)MenuBar決定了所創(chuàng)建的CommandBar 對(duì)象是否被顯示成菜單欄。下面的例子創(chuàng)建了一個(gè)名叫“Custom Menu Bar”的新菜單欄。
Set cstm = CommandBars.Add(Name:="Custom Menu Bar", Position:=msoBarTop, _
MenuBar:=True, Temporary:=False)
添加菜單
用戶可以向任何內(nèi)置或自定義菜單欄中添加一個(gè)菜單。因?yàn)镸icrosoft Office 應(yīng)用程序能夠在不同的內(nèi)容中顯示不同的內(nèi)置菜單欄,所以也可以在不只一個(gè)菜單欄中添加一條相同的命令,以此保證用戶無論是在什么上下關(guān)系里都可以使用該命令。例如,在Microsoft Excel 中,用戶可能想給每個(gè)菜單欄添加一個(gè)專門的Accounting菜單,于是公司里的雇員可以在任何工作表里運(yùn)行相應(yīng)的宏。
在向菜單欄添加菜單時(shí),用戶可以為該菜單指定訪問鍵;當(dāng)顯示菜單時(shí),訪問鍵下面加有下劃線。
注釋 雖然Microsoft Office應(yīng)用程序可以在“自定義”對(duì)話框的“工具欄”表中列出包含快捷菜單的工具欄,但是用戶既不能直接向這些工具欄添加自定義快捷菜單,也不能從中刪除內(nèi)置的快捷菜單。但是,用戶能夠在快捷菜單上添加、刪除或自定義菜單項(xiàng)。要做更多的了解,請參考本節(jié)后面的“添加和修改快捷菜單”的內(nèi)容。
使用“自定義”對(duì)話框
“自定義”對(duì)話框?yàn)橄騼?nèi)置或自定義菜單欄添加菜單提供了一種便利的方法。
向菜單欄添加自定義菜單
如果“自定義”對(duì)話框尚未打開,用鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果要進(jìn)行修改的菜單欄沒有顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該菜單欄名字旁邊的復(fù)選框內(nèi)打上對(duì)鉤。
在“命令”表中,在“類別”一欄內(nèi)單擊“新菜單”。
將“新菜單”一項(xiàng)從“命令”欄拖到菜單欄中想添加菜單的地方。
在菜單欄中的“I”形條指出了在放開鼠標(biāo)鍵時(shí)新菜單添加的位置。
在新菜單上單擊鼠標(biāo)右鍵,然后在“名字”欄中鍵入一個(gè)名字。在為該菜單設(shè)定的作為訪問鍵的字母前面鍵入一個(gè)“&”符。
當(dāng)單擊該菜單的名字時(shí),就顯示出一個(gè)空菜單。要了解有關(guān)向新菜單中添加菜單項(xiàng)的內(nèi)容,請參看本節(jié)后面“添加命令和命令分組”的內(nèi)容。
“自定義”對(duì)話框還為向內(nèi)置或自定義菜單欄添加任何內(nèi)置菜單的副本提供了一種快捷的方法。用戶可以自定義副本中的命令而不會(huì)影響到原來的內(nèi)置菜單。
向菜單欄添加內(nèi)置菜單的副本
如果“自定義”對(duì)話框尚未打開,將鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果要進(jìn)行修改的菜單欄沒有顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該菜單欄名字旁邊的復(fù)選框打上對(duì)鉤。
在“命令”表中,在“類別”一欄內(nèi)單擊“內(nèi)置菜單”。
將“內(nèi)置菜單”一項(xiàng)從“命令”欄拖到菜單欄中想添加菜單的地方。
在菜單欄中的“I”形條指出了在放開鼠標(biāo)鍵時(shí)新菜單添加的位置。
技巧 用戶也可以打開包含了要被復(fù)制的菜單的菜單欄,然后按下“CTRL”,同時(shí)將該菜單從中拖到另一個(gè)菜單欄里,完成復(fù)制。
用戶需使用CommandBarControls集合中的Add方法來向CommandBar對(duì)象添加菜單,該對(duì)象表示某個(gè)菜單欄。在msoControlPopup里設(shè)置Add方法的Type參數(shù)指示所添加的控件用來顯示一個(gè)菜單。顯示菜單的控件叫做pop-up(彈出)控件。參數(shù)Before指示新菜單在原有菜單欄諸菜單中的位置。通過Add法設(shè)置對(duì)象CommandBarPopup的Caption屬性,用于指定菜單的名稱和訪問鍵。以下這個(gè)Microsoft Excel的例子在工作表菜單欄的“窗口”菜單左邊添加了一個(gè)名為“Accounting”的新菜單。
Set cstmAccounting = CommandBars("Worksheet Menu Bar").Controls _
.Add(Type:=msoControlPopup, Before:=9)
cstmAccounting.Caption = "&Accounting"
注釋 用戶在新菜單的名稱里作為該菜單訪問鍵的字母前面加一個(gè)“&”符。一旦添加好了菜單,當(dāng)用戶通過Controls(Index)引用該菜單時(shí),可以在菜單名中使用“&”符,也可以不用。
添加子菜單
子菜單是附加在另一個(gè)菜單(父菜單)旁邊,靠近某個(gè)菜單項(xiàng)(子菜單標(biāo)題) 的菜單。用戶可以給菜單、其他的子菜單和快捷菜單添加子菜單。
當(dāng)用戶單擊菜單欄中的菜單名顯示出該菜單的各項(xiàng)時(shí),可以將鼠標(biāo)指到父菜單中的子菜單標(biāo)題上,這時(shí)子菜單上的菜單項(xiàng)就顯示出來。類似于首先給菜單欄添加一個(gè)空菜單(有名字但沒有菜單項(xiàng))然后再添加某些菜單項(xiàng),用戶也須首先給父菜單添加一個(gè)空的子菜單,然后再添加菜單項(xiàng)。
使用“自定義”對(duì)話框
使用“自定義”對(duì)話框來給另一個(gè)菜單添加子菜單。
向菜單添加子菜單
如果“自定義”對(duì)話框尚未打開,用鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果包含要進(jìn)行修改的菜單的菜單欄沒有顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該菜單欄名字旁邊的復(fù)選框內(nèi)打上對(duì)鉤。
在“命令”表中,在“類別”一欄內(nèi)單擊“新菜單”。
將“新菜單”一項(xiàng)從“命令”欄拖到菜單欄中想添加子菜單的地方。
為了指出新子菜單的位置,把它從菜單名(如果有必要,隨同后面的子菜單題注)上拖過,以此來打開要添加子菜單的菜單或子菜單,再拖到它在該菜單或子菜單中所處的位置上,然后放開鼠標(biāo)左鍵。在菜單欄中的水平的“I”形條指出了在放開鼠標(biāo)左鍵時(shí)子菜單添加的位置。
在新的子菜單上單擊鼠標(biāo)右鍵,然后在“名字”欄中鍵入一個(gè)名字。在為該子菜單設(shè)定的作為訪問鍵的字母前面鍵入一個(gè)“&”符。
當(dāng)單擊該子菜單的名字時(shí),就顯示出一個(gè)空的子菜單。要了解有關(guān)如何向新的子菜單中添加菜單項(xiàng),請參看本節(jié)后面“添加命令和命令分組”一節(jié)的內(nèi)容。
用戶需使用CommandBarControls集合的Add方法來向CommandBar對(duì)象添加子菜單,該對(duì)象表示另一個(gè)菜單欄。在msoControlPopup里設(shè)置Add方法的Type參數(shù)用來指定出添加的控件是一個(gè)pop-up(彈出)控件-類型和指示菜單欄中某個(gè)菜單的控件相同。參數(shù)Before指定了新菜單在原有菜單欄諸菜單中的位置。通過Add方法設(shè)置CommandBarPopup對(duì)象的Caption屬性,用于指定子菜單的名稱和訪問鍵。在下面這個(gè)Microsoft Excel的例子中在工作表菜單欄的Accounting菜單底下添加了一個(gè)名為“Product”的新的子菜單。
Set cstmAcctProduct = CommandBars("Worksheet Menu Bar").Controls("Accounting") _
.Controls.Add(Type:=msoControlPopup)
cstmAccProduct.Caption = "&Product"
注釋 用戶在新子菜單的名稱里作為該菜單訪問鍵的字母前面加一個(gè)“&”符。一旦添加好了子菜單,當(dāng)用戶通過Controls(索引)引用該子菜單時(shí),可以在子菜單名中使用“&”符,也可以不用。
添加命令和命令分組
用戶可以給任何內(nèi)置或自定義的菜單或子菜單添加命令,也可以修改其外觀并且進(jìn)行直觀上的邏輯分組。本節(jié)討論如何向菜單和子菜單添加命令。下面的一節(jié)討論如何添加快捷菜單以及向快捷菜單添加菜單項(xiàng)這一特殊問題。
注釋 雖然可以向菜單和子菜單添加文本框、列表框以及組合框,但這通常不是顯示或返回信息的最好辦法。如果要添加自定義文本框、列表框和組合框,須使用和把它們添加到工具欄中相同的技術(shù)(參考本章后面的“工具欄的設(shè)計(jì)時(shí)刻修改”一節(jié)的內(nèi)容)。
使用“自定義”對(duì)話框
“自定義”對(duì)話框提供了向菜單和子菜單添加菜單項(xiàng)的一種簡便的方法。
向菜單或子菜單添加內(nèi)置命令
如果“自定義”對(duì)話框尚未打開,用鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果包含要進(jìn)行修改的菜單的菜單欄沒有顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該菜單欄名字旁邊的復(fù)選框打上對(duì)鉤。
在“命令”表中,在“類別”一欄中選擇命令的類別。
該類別的所有命令都列在“命令”一欄中。
將命令從“命令”欄中拖到菜單或子菜單中添加該命令的位置。
為了指出命令的位置,把該命令從菜單名(如果有必要,隨同后面的子菜單標(biāo)題)上拖過,以此來打開要添加命令的菜單或子菜單,再拖到它在該菜單或子菜單中應(yīng)處的位置上,然后放開鼠標(biāo)左鍵。在菜單欄中的水平的“I”形條指出了在放開鼠標(biāo)左鍵時(shí)命令添加的位置。
技巧 用戶也可以打開包含了要被復(fù)制的內(nèi)置命令的菜單欄,然后按下“CTRL”,同時(shí)將該命令從中拖到另一個(gè)菜單欄里,完成復(fù)制。
用戶也可以從“自定義”對(duì)話框也提供了向內(nèi)置或自定義菜單欄添加自定義命令的一種快捷方法。但是,每種Microsoft Office應(yīng)用程序都包含了不同的技術(shù)來使用“自定義”對(duì)話框完成該功能。下面的段落介紹了這些區(qū)別。
Microsoft Excel 按照和向菜單添加內(nèi)置命令的過程相同的步驟來完成;在“類別”欄內(nèi),單擊“宏”,然后將“自定義菜單項(xiàng)”從“命令”欄拖到它在菜單中應(yīng)處的位置。在新菜單項(xiàng)上單擊鼠標(biāo)右鍵,任何單擊“指定宏”。在“指定宏”對(duì)話框的“宏名”一欄中,鍵入要運(yùn)行的宏的名字。
修改命令的外觀
在菜單中的任何命令都可以在該命令的名字旁邊顯示出一個(gè)圖標(biāo)按鈕。命令的“樣式”決定了是否在命令旁邊顯示出一個(gè)圖標(biāo)按鈕。“自定義”對(duì)話框打開后,使用快捷菜單上的命令來設(shè)定命令的式樣。下表描述了式樣對(duì)菜單命令的影響。
式樣
菜單的外觀
默認(rèn)式樣
圖標(biāo)按鈕和名字
純文本(在菜單中)
只有名字
純文本(一般)
只有名字
圖標(biāo)和文本
圖標(biāo)按鈕和名字
注釋 在默認(rèn)情況下,有些內(nèi)置菜單命令沒有和它們相關(guān)聯(lián)的圖標(biāo)按鈕,無論設(shè)置何種式樣都不會(huì)顯示圖標(biāo)。但是,可以給任何內(nèi)置菜單命令添加圖標(biāo)。
當(dāng)“自定義”對(duì)話框打開后,可以添加或修改菜單命令旁邊的圖標(biāo)按鈕。下表列出了可以使用的技術(shù)。
目 的
做 法
使用預(yù)定義的圖標(biāo)按鈕 用鼠標(biāo)右鍵單擊該命令,指到“更改按鈕圖標(biāo)”,然后單擊要選擇的圖標(biāo)。
復(fù)制和粘貼另一個(gè)命令的圖標(biāo) 用鼠標(biāo)右鍵單擊被復(fù)制的圖標(biāo)所屬的命令,然后選擇“復(fù)制按鈕圖標(biāo)”。在自定義圖標(biāo)的命令上單擊鼠標(biāo)右鍵,然后選擇“粘貼按鈕圖標(biāo)”。
從圖形程序復(fù)制和粘貼 在圖形程序中,打開要復(fù)制的圖標(biāo)。選擇和復(fù)制該圖標(biāo)(最好是16x16象素的圖形)。切換回原應(yīng)用程序,單擊“粘貼按鈕圖標(biāo)”。
編輯命令的當(dāng)前按鈕圖標(biāo) 在命令上單擊鼠標(biāo)右鍵,然后選擇“編輯按鈕圖標(biāo)”。在“按鈕編輯器”中,可以改變圖標(biāo)的顏色和形狀,調(diào)整圖標(biāo)在控件上的位置,并且可以對(duì)修改進(jìn)行預(yù)覽。當(dāng)完成對(duì)圖標(biāo)的編輯后,單擊“確定”。
用命令的原始按鈕圖標(biāo)對(duì)命令進(jìn)行復(fù)位 在命令上單擊鼠標(biāo)右鍵,然后選擇“復(fù)位按鈕圖標(biāo)”。
命令分組
用戶可以在菜單中用線條將相關(guān)的命令分隔成組。線條本身并不是菜單項(xiàng);而且可以在菜單中的任何一項(xiàng)前面設(shè)置出現(xiàn)分隔線。用戶可以在“自定義”對(duì)話框中將一條命令設(shè)為一組命令中的第一項(xiàng)。
在菜單中開始一個(gè)命令組
如果“自定義”對(duì)話框尚未打開,將鼠標(biāo)指到“視圖”菜單的“工具欄”上,然后單擊“自定義”。
如果包含要進(jìn)行修改的菜單的菜單欄尚未顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該菜單欄名字旁邊的復(fù)選框打上對(duì)鉤。
在希望上方出現(xiàn)分隔線的菜單項(xiàng)上單擊鼠標(biāo)右鍵,然后選擇“開始一組”。
在該項(xiàng)上再次單擊鼠標(biāo)右鍵,在快捷菜單上的“開始一組”旁邊出現(xiàn)一個(gè)對(duì)鉤。要去掉菜單項(xiàng)之前的分隔線,可以在該項(xiàng)上單擊鼠標(biāo)右鍵然后再次選擇“開始一組”(不再出現(xiàn)對(duì)鉤)。
用戶需使用CommandBarControls集合的Add方法來給CommandBar對(duì)象添加新的菜單項(xiàng),該對(duì)象表示某個(gè)菜單或子菜單。要添加內(nèi)置命令,可以使用Add方法的參數(shù)Id指定該命令的ID編號(hào)。在下面這個(gè)例子在“Custom Menu Bar”菜單欄的 “Quick Tools”菜單里添加了“Spelling”命令。
Set mySpell = CommandBars("Custom Menu Bar").Controls("Quick Tools") _
.Controls.Add(Id:=2)
要對(duì)如何確定Microsoft Office 應(yīng)用程序的內(nèi)置命令的ID編號(hào)做進(jìn)一步了解,請參考本章后面的“菜單項(xiàng)和菜單欄控件ID編號(hào)”一節(jié)的內(nèi)容。
要添加一條菜單命令,可以先添加一條新的菜單項(xiàng),然后設(shè)置OnAction 屬性來指定點(diǎn)擊該項(xiàng)時(shí)運(yùn)行的Visual Basic程序。設(shè)置Add 法的參數(shù)Type為msoControlButton指出該菜單項(xiàng)是一條命令。在下面這個(gè)Microsoft Excel例子里在工作表工具欄的“文件”菜單中添加了一個(gè)Open Database菜單項(xiàng)。當(dāng)用戶點(diǎn)擊該菜單項(xiàng)時(shí),Microsoft Excel 運(yùn)行Visual Basic程序OpenDatabaseProc。Open Database直接出現(xiàn)在File菜單中Close命令的上面。
Set databaseItem = CommandBars("Worksheet Menu Bar").Controls("File") _
.Controls.Add(Type:=msoControlButton, Before:=3)
With databaseItem
.Caption:="Open Database"
.OnAction:="OpenDatabaseProc"
End With
用戶可以在Visual Basic 中設(shè)置表示菜單命令的對(duì)象它的許多屬性,以此修改命令的外觀。要做更進(jìn)一步了解,請參考“幫助”中的Style屬性和FaceID 屬性,以及CommandBarButtion對(duì)象的其他屬性和方法的幫助主題。
設(shè)置開始一組菜單項(xiàng)的菜單項(xiàng)(也就是說,前面有一線條的命令項(xiàng)),需要設(shè)置表示菜單項(xiàng)的CommandBarButton、CommandBarPopup或者CommandBarComboBox對(duì)象的BeginGroup屬性為True(真)。要去除該線條,則設(shè)置屬性BeginGroup為False(假)。使用Controls(Index) 來返回一個(gè)表示該項(xiàng)的對(duì)象,此處的Index是指菜單項(xiàng)的標(biāo)題或索引號(hào)。下面的例子在“文件”菜單的Open Database 命令(在上面的例子里添加的)前面添加了一條分隔線。
Set databaseItem = CommandBars("Worksheet Menu Bar").Controls("File") _
.Controls("Open Database")
databaseItem.BeginGroup = True
添加和修改快捷菜單
Microsoft Excel提供事件-BeforeRightClick-可以通過修改內(nèi)置快捷菜單或顯示自定義快捷菜單來響應(yīng)它。
使用“自定義”對(duì)話框
用戶可以使用CommandBars集合的Add方法來創(chuàng)建新的快捷菜單;將Add方法的參數(shù)Position設(shè)置為msoBarPopup,以此指出所創(chuàng)建的CommandBar對(duì)象應(yīng)顯示為快捷菜單。下面的例子創(chuàng)建了一個(gè)名為“Shortcuts1”的新快捷菜單。
Set cstm = CommandBars.Add(Name:="Shortcuts1", Position:=msoBarPopup, _
MenuBar:=False, Temporary:=False)
要在任何Microsoft Office應(yīng)用程序中用Visual Basic修改自定義或內(nèi)置快捷菜單,可以采用和前面章節(jié)講述的使用Visual Basic向菜單里添加子菜單或命令相同的技術(shù)。使用CommandBars(name) 返回表示該快捷菜單的一個(gè)CommandBar對(duì)象,這里的name是指快捷菜單的名字。于是用戶可以添加或修改任何在CommandBar對(duì)象中有效的Controls集合里的元素。
刪除菜單組件
用戶可以從菜單中刪除內(nèi)置或自定義的菜單項(xiàng),可以從菜單欄中刪除內(nèi)置或自定義的菜單,還可以刪除自定義菜單欄。但是要注意,即使可以刪除快捷菜單和內(nèi)置菜單欄上的所有項(xiàng),還是不能刪除快捷菜單或內(nèi)置菜單欄本身。
刪除內(nèi)置菜單組件可以幫助用戶根據(jù)需要定制自己的Visual Basic應(yīng)用程序。例如,用戶可能想從菜單中刪除某條內(nèi)置命令,并且用一個(gè)自定義命令的版本來替換它,該命令可為用戶完成特殊的任務(wù)。用戶也可能要?jiǎng)h除某個(gè)菜單項(xiàng)以簡化界面或者降低無經(jīng)驗(yàn)者選擇使用不適當(dāng)命令的可能性。
注釋 用戶可以恢復(fù)已經(jīng)刪除的內(nèi)置菜單欄、菜單或菜單項(xiàng)。但是,不能恢復(fù)自定義的菜單欄、菜單或菜單項(xiàng);必須重新創(chuàng)建它們。
使用“自定義”對(duì)話框
打開“自定義”對(duì)話框的情況下,用戶可以刪除任何菜單組件。
刪除菜單系統(tǒng)組件
如果“自定義”對(duì)話框尚未打開,將鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果包含要?jiǎng)h除的菜單組件的菜單欄尚未顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該菜單欄名字旁邊的復(fù)選框打上對(duì)鉤。
在要?jiǎng)h除的菜單組件上單擊鼠標(biāo)右鍵,然后在快捷菜單中選擇“刪除”。
要?jiǎng)h除一個(gè)完整的自定義菜單欄,可以打開“自定義”對(duì)話框,選中“工具欄”表內(nèi)“工具欄”一欄中該菜單欄的名字,然后單擊“刪除”按鈕。就將內(nèi)置菜單欄刪除了。
用戶可以使用Delete方法來刪除自定義菜單欄、自定義或內(nèi)置下拉菜單或子菜單以及自定義或內(nèi)置菜單項(xiàng)。但是不能刪除內(nèi)置菜單欄或快捷菜單。
以下Microsoft Excel中的例子刪除了繪圖菜單欄里的“編輯”菜單。
CommandBars("Chart Menu Bar").Controls("Edit").Delete
以下的例子刪除名為“Custom Menu Bar”的自定義菜單欄。
CommandBars("Custom Menu Bar").Delete
要了解如何恢復(fù)已刪除的內(nèi)置菜單組件,請參考下面一節(jié)的內(nèi)容。
恢復(fù)內(nèi)置菜單組件
用戶能夠恢復(fù)已經(jīng)被刪除的內(nèi)置菜單欄、菜單或菜單項(xiàng)。但是,不能恢復(fù)已經(jīng)刪除的自定義菜單欄、菜單或菜單項(xiàng);必須重建它們。
使用“自定義”對(duì)話框
用戶可以使用“自定義”對(duì)話框來再次恢復(fù)內(nèi)置菜單或子菜單中各個(gè)原始的內(nèi)置菜單項(xiàng)。同樣地,在恢復(fù)內(nèi)置菜單欄的同時(shí)在該菜單欄中的所有菜單和子菜單也被重新恢復(fù)。
恢復(fù)內(nèi)置菜單
如果“自定義”對(duì)話框尚未打開,用鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果包含將要被恢復(fù)的菜單的菜單欄尚未顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該菜單欄名字旁邊的復(fù)選框打上對(duì)鉤。
在要?jiǎng)h除的菜單或子菜單上單擊鼠標(biāo)已經(jīng),如何在快捷菜單中選擇“恢復(fù)”。
要恢復(fù)內(nèi)置菜單欄,需要打開“自定義”對(duì)話框,選中“工具欄”表內(nèi)“工具欄”一欄中該菜單欄的名字,然后單擊“恢復(fù)”按鈕。
使用Visual Basic
使用Reset 方法恢復(fù)內(nèi)置菜單欄、菜單或子菜單組件。
以下Microsoft Excel中的例子恢復(fù)了繪圖菜單欄中的“編輯”菜單。
CommandBars("Chart Menu Bar").Controls("Edit").Reset
菜單系統(tǒng)的運(yùn)行時(shí)刻修改
用戶可以在設(shè)計(jì)時(shí)刻對(duì)創(chuàng)建的菜單系統(tǒng)進(jìn)行編程,使之在運(yùn)行時(shí)能夠?qū)l件的變化動(dòng)態(tài)地作出響應(yīng)。用戶可以用自己創(chuàng)建的自定義菜單欄替換默認(rèn)菜單欄。如果某個(gè)菜單項(xiàng)用在某種上下關(guān)系中不合適,可以刪除、隱藏或禁用該項(xiàng)以防止用戶選中它(禁用菜單項(xiàng)也叫做使菜單項(xiàng)變暗,或者變灰)。如果一個(gè)菜單項(xiàng)用兩種可能的狀態(tài)來表示選項(xiàng),用戶可以使用命令圖標(biāo)按鈕,在按鈕被按下時(shí)表示打開選項(xiàng),按鈕被放開時(shí)表示關(guān)閉選項(xiàng)。最后,用戶可能向根據(jù)當(dāng)前的狀態(tài)而對(duì)菜單項(xiàng)進(jìn)行重命名。例如,在Microsoft Excel中,單擊“窗口”菜單里的“凍結(jié)拆分窗口”,它將變?yōu)椤俺蜂N窗口凍結(jié)”。
注釋 雖然既可以用“自定義”對(duì)話框也可以用Visual Basic來對(duì)菜單系統(tǒng)進(jìn)行設(shè)計(jì)時(shí)刻更改,但是卻只能用Visual Basic來進(jìn)行運(yùn)行時(shí)刻的更改。
顯示自定義菜單欄
要顯示自定義菜單欄而不是活動(dòng)菜單欄,用戶必須將表示該自定義菜單欄的CommandBar對(duì)象的Visible屬性設(shè)置為True(真)。(要了解如何創(chuàng)建替換活動(dòng)菜單欄的菜單欄,請參考本章前面的“添加自定義菜單欄”中的內(nèi)容。)新的可見菜單欄會(huì)自動(dòng)地替換活動(dòng)菜單欄。當(dāng)Visual Basic應(yīng)用程序運(yùn)行結(jié)束時(shí),可以將Visible 屬性設(shè)為False(假),重新顯示默認(rèn)菜單欄。
每當(dāng)用戶啟動(dòng)Microsoft Office應(yīng)用程序時(shí),都會(huì)顯示默認(rèn)菜單欄。在Word里,可以在啟動(dòng)時(shí)用自定義菜單欄來替換默認(rèn)菜單欄-在退出程序前保存Normal模板的時(shí)候,最后顯示的那個(gè)菜單欄是Word再次啟動(dòng)時(shí)的默認(rèn)菜單欄。用戶可以在Open事件過程中將某個(gè)菜單欄的Visible屬性設(shè)置為True(真),用它來替換默認(rèn)菜單欄。
動(dòng)態(tài)地顯示菜單組件
如果一個(gè)菜單組件僅僅用于某個(gè)專門的文檔,那么該菜單組件最好只在該文檔處于活動(dòng)狀態(tài)時(shí)才顯示;這樣做減輕了界面上不必要的混亂。用戶可以限定某個(gè)菜單組件的生命周期,使之僅在用于文檔時(shí)才出現(xiàn)。
如果用戶想讓菜單或菜單項(xiàng)僅僅為特定的文檔出現(xiàn),那么可以對(duì)Visual 屬性進(jìn)行設(shè)置,在用戶每次激活文檔時(shí)才顯示該組件,而每當(dāng)文檔失活時(shí)又將該組件隱藏起來。如果用戶想把菜單欄同特定的文檔關(guān)聯(lián)起來,那么也可以對(duì)Visual 屬性進(jìn)行設(shè)置,在用戶激活文檔時(shí)顯示菜單欄,同時(shí)在文檔失活時(shí)隱藏菜單欄,而不是每次都實(shí)際地添加或刪除菜單欄。
要?jiǎng)討B(tài)地顯示菜單組件,不但要編寫適當(dāng)?shù)氖录绦騺韱⒂媒M件或顯示組件,而且要編寫事件程序來禁用或隱藏組件。如果正在對(duì)其菜單欄進(jìn)行修改的應(yīng)用程序不支持事件,那也就不能自定義動(dòng)態(tài)的界面。對(duì)于這類應(yīng)用程序的解決辦法是為其他菜單項(xiàng)或工具欄按鈕的OnAction屬性指定類似的程序。如果應(yīng)用程序支持ActiveX控件嵌入,那么也可以修改容器應(yīng)用程序的界面來對(duì)那個(gè)控件所支持的事件進(jìn)行響應(yīng)。
啟用或禁用菜單組件
如果想防止用戶在某種條件下選擇某個(gè)特殊的菜單項(xiàng),可以禁用該菜單項(xiàng)。被禁用的命令仍然出現(xiàn)在菜單上,但是它變得陰暗,不響應(yīng)用戶的動(dòng)作。使用Enable屬性來啟用或禁用菜單項(xiàng)。如果菜單項(xiàng)被啟用,那么Enable屬性為True(真),如果菜單項(xiàng)被禁用,Enable屬性為False(假)(但是不能設(shè)置內(nèi)置菜單項(xiàng)的Enable屬性)。下面的這個(gè)Microsoft Excel中的例子向工作簿菜單欄的“文件”菜單中添加了Open Database命令,如何禁用該命令。
CommandBars("Worksheet Menu Bar").Controls("File") _
.Controls.Add("Open Database").Enabled = False
如果用戶想禁用在某個(gè)菜單中的所有命令,那么可以禁用菜單本身。這樣可以在用戶不再訪問菜單上所有的命令時(shí),有效地禁用它們。下面的這個(gè)Microsoft Excel中的例子,禁用了工作簿菜單欄上的整個(gè)“文件”菜單。
CommandBars("Worksheet Menu Bar").Controls("File").Enabled = False
注釋 可以禁用子菜單上的所有菜單項(xiàng),但是卻不能禁用子菜單本身。
指定菜單項(xiàng)的狀態(tài)
如果一個(gè)菜單項(xiàng)表示的選項(xiàng)只有兩種可能的狀態(tài),那么可以在該菜單項(xiàng)旁邊添加圖標(biāo)按鈕,用按鈕是否被按下來顯示選項(xiàng)的狀態(tài)。每次用戶單擊該菜單項(xiàng)時(shí),按鈕就變到相反的狀態(tài)-也就是打開或者關(guān)閉選項(xiàng)。用戶可以通過設(shè)置菜單項(xiàng)的State屬性來更改其外觀。
要想弄清楚它是如何起作用的,可以假定以下例子中的 Microsoft Excel程序被指定到工作簿菜單欄中“視圖”菜單里的自定義菜單項(xiàng)“Database”,該菜單項(xiàng)向用戶提供了了兩種選擇,是在數(shù)據(jù)庫視圖中還是在工作簿視圖中查看工作簿。用戶每次單擊菜單項(xiàng)Database,程序就將菜單項(xiàng)旁邊的按鈕圖標(biāo)在按下和放開之間進(jìn)行切換(也就是說,程序設(shè)置State屬性,然后切換視圖)。
Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
If .State = msoButtonUp Then
.State = msoButtonDown
'Switch to database view
Else
.State = mosButtonUp
'Switch to worksheet view
End If
End With
End Sub
每個(gè)內(nèi)置和自定義菜單項(xiàng)都有文本和按鈕圖標(biāo);許多內(nèi)置菜單項(xiàng)有空白的按鈕圖標(biāo)。當(dāng)使用“自定義”對(duì)話框來向菜單添加菜單項(xiàng)時(shí),可以指定和修改該項(xiàng)的按鈕圖標(biāo)。在運(yùn)行時(shí)刻,用戶可以設(shè)置菜單項(xiàng)的FaceId屬性,用來指定菜單項(xiàng)狀態(tài)改變時(shí)該菜單項(xiàng)旁邊顯示的按鈕圖標(biāo)。要指定菜單項(xiàng)旁邊顯示的按鈕圖標(biāo),必須找出帶有該按鈕圖標(biāo)的內(nèi)置命令,判斷它的ID,然后為FaceId屬性賦值。(改變一個(gè)菜單項(xiàng)的FaceId屬性不會(huì)改變它的功能。)要對(duì)判斷內(nèi)置命令I(lǐng)D編號(hào)作更多了解,請參考本章后面“菜單項(xiàng)和工具欄控件的ID”一節(jié)的內(nèi)容。
以下Microsoft Excel中的例子,不但切換了菜單項(xiàng)旁邊按鈕圖標(biāo)的狀態(tài),而且還改變了圖標(biāo)。當(dāng)用戶切換到數(shù)據(jù)庫視圖時(shí),按鈕圖標(biāo)被切換到grid(ID 987)。類似地,當(dāng)用戶切從數(shù)據(jù)庫視圖切換出去時(shí),圖標(biāo)被設(shè)置為blank face(ID 1)。
Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
If .State = msoButtonUp Then
.FaceId = 987
.State = msoButtonDown
'Switch to database view
Else
.FaceId = 1
.State = mosButtonUp
'Switch to worksheet view
End If
End With
End Sub
對(duì)菜單項(xiàng)進(jìn)行重命名
如果用戶使用菜單項(xiàng)的Caption屬性去更改菜單項(xiàng)的名稱,以此來響應(yīng)Visual Basic代碼中條件的改變。例如,假定用戶已經(jīng)創(chuàng)建了一個(gè)用于打開數(shù)據(jù)庫的菜單命令。在用戶打開數(shù)據(jù)庫之后,用戶可能會(huì)希望用關(guān)閉該數(shù)據(jù)庫的命令來替換原來的命令。下面的例子說明了作用實(shí)在上述的功能。
CommandBars("MyMenubar").Controls("File").Controls("Open Database") _
.Caption = "Close &Database"
用這種辦法對(duì)菜單項(xiàng)進(jìn)行重命名時(shí),要確保應(yīng)用程序中的其他過程按照新名字來引用該菜單項(xiàng)(在本例中的新名字是Close Database,“關(guān)閉數(shù)據(jù)庫”)。
也可以使用代表菜單項(xiàng)的變量。采用這種技術(shù)的好處之一是即使菜單項(xiàng)的標(biāo)題改變了,變量仍然能夠繼續(xù)起作用。下面的例子給菜單項(xiàng)Open Database(“打開數(shù)據(jù)庫”)設(shè)置了一個(gè)變量。
Set openData = CommandBars("My Menubar").Controls _
("File").Controls("Open Database")
可以用下面例子中的代碼來更改標(biāo)題。
openData.Caption = "Close &Database"
工具欄
每一個(gè)Microsoft Office應(yīng)用程序都提供一個(gè)包含工具欄控件的工具欄系統(tǒng),用戶可以借助工具欄控件頻繁地使用命令。每個(gè)工具欄都可以定位在應(yīng)用程序窗口的頂部、底部以及左邊或者右邊,也可以作為浮動(dòng)窗口放置在工作區(qū)的任何位置上。每個(gè)工具欄控件都是一個(gè)簡單的圖形化的控件,用戶通過它和Visual Basic應(yīng)用程序交換信息。要在一個(gè)Office應(yīng)用程序中顯示任何工具欄,可將鼠標(biāo)指向“視圖”菜單中的“工具欄”,然后單擊需要顯示的工具欄的名字。要查看其他的有效工具欄,可打開“自定義”對(duì)話框并且瀏覽在“類型”一欄中列出的多個(gè)工具欄。
工具欄控件可以分為幾種類型;它們將在下面的段落中進(jìn)行介紹。
最常用的工具欄按鈕類型是包含一個(gè)小圖標(biāo)的簡單按鈕控件。這個(gè)圖標(biāo)稱為按鈕圖標(biāo),直觀地表示出工具欄按鈕激活的命令或選項(xiàng)。用戶可以單擊其中一個(gè)工具欄圖標(biāo)來執(zhí)行一條命令(例如,單擊“常用”工具欄上的“新建”按鈕可以創(chuàng)建一個(gè)新文檔)或者在由一個(gè)按鈕所表示的選項(xiàng)的兩種可能狀態(tài)之間進(jìn)行交替切換(例如,單擊“格式”工具欄上的“加粗”按鈕,可以交替地設(shè)定所選文本為粗體或去除所選文本的粗體)。
工具欄控件的另一種類型包含了一個(gè)小圖標(biāo)和附加的下拉式調(diào)色板。用戶單擊下拉箭頭就可以顯示出調(diào)色板,然后選擇調(diào)色板上的某個(gè)選項(xiàng)。用戶單擊按鈕控件來應(yīng)用當(dāng)前選項(xiàng)。例如,在Microsoft Excel中,單擊字體顏色按鈕上的單擊工具欄控件的按鈕下拉箭頭就顯示出字體顏色調(diào)色板,用戶可以從中進(jìn)行選擇。
工具欄控件也可以是文本框、列表框或組合框。用戶可以在文本框中鍵入文本或點(diǎn)擊下拉箭頭,然后在列表中選擇選項(xiàng)。例如,在“格式”工具欄上,既可以在“字號(hào)”下拉列表框中點(diǎn)中一個(gè)選項(xiàng),
最后一種工具欄控件是pop-up(彈出)控件,它那個(gè)顯示其他控件的菜單。在工具欄上的pop-up控件和菜單欄上菜單的名字從本質(zhì)上講是一樣。Microsoft Excel、Word或PowerPoint中“繪圖”工具欄的“繪圖”按鈕都是pop-up控件的例子。
注釋 雖然工具欄控件和ActiveX控件有著相似的外觀和方式,但是它們兩者是不相同的。不能向工具欄添加ActiveX控件,也不能向文檔或窗體添加工具欄控件。
既然理解了什么是工具欄以及工具欄控件的種類,就可以研究前面介紹的修改工具欄和工具欄控件的細(xì)節(jié)。在下面的各節(jié)中,將討論怎樣對(duì)工具欄和工具欄控件進(jìn)行設(shè)計(jì)時(shí)刻和運(yùn)行時(shí)刻的更改。
自定義工具欄的原則
Microsoft Office的應(yīng)用程序向用戶提供了修改內(nèi)置工具欄的廣泛途徑,使它能更好地為用戶服務(wù)。用戶可以創(chuàng)建新的工具欄;向內(nèi)置或自定義工具欄添加新的工具欄按鈕;修改工具欄按鈕上的圖標(biāo);以及為工具欄按鈕指定宏、“工具提示”文本和狀態(tài)欄文本。
是修改內(nèi)置工具欄還是創(chuàng)建新的工具欄取決于要進(jìn)行更改的程度。如果僅添加或修改幾個(gè)工具欄按鈕,那么修改內(nèi)置工具欄是有意義的;如果想提供的對(duì)命令的分類與現(xiàn)有的任何內(nèi)置工具欄完全不同,或者要用一些自定義工具欄按鈕來作為特別組,那么創(chuàng)建新的工具欄會(huì)更方便一些。無論所做的改變有多大,只要愿意,都可以把內(nèi)置菜單系統(tǒng)恢復(fù)到默認(rèn)的狀態(tài)。
除了上述通常在設(shè)計(jì)時(shí)刻所做的變化之外,還可以使用Visual Basic程序,通過改變工具欄和工具欄按鈕的屬性,來對(duì)應(yīng)用程序運(yùn)行時(shí)用戶的輸入作出響應(yīng)(也就是說,在運(yùn)行時(shí)刻)。例如,當(dāng)用戶不再需要某個(gè)工具欄時(shí),可以把它隱藏起來,也可以移動(dòng)它或改變它的大小使它不再擋路,還可以禁用某個(gè)工具欄按鈕以防用戶在不適當(dāng)?shù)臅r(shí)刻點(diǎn)中它,以及在用戶每次點(diǎn)中工具欄按鈕時(shí)讓工具欄按鈕在按下和放開之間切換。
使用菜單
可以把pop-up(彈出)控件-和顯示菜單欄中的菜單以及菜單中的子菜單相同的控件-添加到任何內(nèi)置或自定義工具欄中。通常,向工具欄添加菜單是在自定義內(nèi)置菜單欄(不會(huì)象添加工具欄控件那么方便)和添加大量工具欄控件之間一種有益的折衷方案。在Microsoft Excel、Word或PowerPoint中,“繪圖”工具欄上的“繪圖”按鈕就是工具欄帶菜單的例子。
向工具欄添加菜單、子菜單和菜單項(xiàng),采取的步驟和將這些組件添加到菜單欄所采取的步驟相同,在本章“菜單的設(shè)計(jì)時(shí)刻修改”一節(jié)作過介紹。
使用文本框、列表框和組合框
在Microsoft Office應(yīng)用程序中,可以向內(nèi)置和自定義工具欄添加文本框、列表框和組合框。這些控件是很有處的,可以從用戶那里頻繁取得信息,也可以運(yùn)行復(fù)雜的程序,程序根據(jù)控件的值在可能的結(jié)果范圍內(nèi)進(jìn)行判斷。
“自定義”對(duì)話框支持向任何工具欄添加內(nèi)置文本框、列表框和組合框,但是不支持添加自定義的文本框、列表框和組合框;作為替代,必須使用Visual Basic來添加和設(shè)計(jì)這些控件。打開“自定義”對(duì)話框,可以更改任一內(nèi)置或自定義文本框、列表框或組合框的寬度。
對(duì)工具欄的設(shè)計(jì)時(shí)刻修改
設(shè)計(jì)時(shí)刻修改包括創(chuàng)建新的工具欄;向工具欄中添加新的或內(nèi)置的工具欄控件;從工具欄中刪除工具欄控件;對(duì)工具欄控件進(jìn)行分組或取消分組;以及改變文本框、列表框和組合框工具欄控件的寬度。用戶還可以選擇一個(gè)新的圖標(biāo),或使用“按鈕編輯器”來自定義一個(gè)圖標(biāo),用來于某個(gè)特殊的工具欄相關(guān)聯(lián)。
添加自定義工具欄
在許多情況下,用戶可以通過向內(nèi)置工具欄添加工具欄控件的方法實(shí)現(xiàn)一個(gè)完整的命令集合。但是如果想要以一種便于使用的形式來表示一個(gè)完整的命令集合,而和所有的內(nèi)置命令完全不同,可以創(chuàng)建一個(gè)新的工具欄。通過“自定義”對(duì)話框或Visual Basic都能實(shí)現(xiàn)這一點(diǎn)。
使用“自定義”對(duì)話框
“自定義”對(duì)話框提供了添加自定義工具欄的一種便利的途徑。
添加工具欄
如果“自定義”對(duì)話框尚未打開,用鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
在“工具欄”表中,單擊“新建”。
在“工具欄名稱”一欄中,鍵入新工具欄的名字,然后單擊“確定”。
顯示出一個(gè)有著該名字的浮動(dòng)的空工具欄。
新工具欄被添加到“工具欄”表中的“工具欄”一欄中。
使用CommandBars集合的Add法來創(chuàng)建新的工具欄,設(shè)置Add方法的參數(shù)Position為msoBarLeft, msoBarTop, msoBarRight, msoBarBottom, 或 msoBarFloating,它們指定創(chuàng)建的CommandBar對(duì)象一個(gè)浮動(dòng)工具欄還是固定位置的工具欄。下面的例子創(chuàng)建并顯示了一個(gè)新的名叫“Custom Tools”的工具欄。
Set cstm = CommandBars.Add(Name:="Custom Tools", Position:=msoBarFloating, _
MenuBar:=False, Temporary:=False)
cstm.Visible = True
添加控件和控件分組
可以向任何內(nèi)置或自定義工具欄添加控件,也可以直觀地(用分隔線)把它們分成邏輯組。
使用“自定義”對(duì)話框
“自定義”對(duì)話框提供了向工具欄添加控件的一種簡單的途徑。
向工具欄添加內(nèi)置控件
如果“自定義”對(duì)話框尚未打開,那么用鼠標(biāo)指到“視圖”菜單的“工具欄”上,然后單擊“自定義”。
如果要作修改的工具欄尚未顯示出來,那么在“工具欄”表的“工具欄”一欄內(nèi)該工具欄名字旁邊的復(fù)選框內(nèi)打上鉤。
在“命令”表中,在“類別”一欄中選中一種命令的類別。
所選類別的命令現(xiàn)在都列在“命令”一欄中。
將控件從“命令”欄中拖到菜單上要添加該控件的位置,然后放開鼠標(biāo)。
在工具欄上的豎直“I”行條指出放開鼠標(biāo)后控件添加的位置。
技巧 用戶也可以打開包含了要被復(fù)制的控件的工具欄,然后按下“CTRL”,同時(shí)將該控件從中拖到另一個(gè)菜單欄里,完成復(fù)制。
“自定義”對(duì)話框也提供了向內(nèi)置或自定義工具欄添加自定義命令的一條快捷的途徑。但是,每個(gè)Microsoft Office應(yīng)用程序都在使用“自定義”對(duì)話框?qū)崿F(xiàn)該功能時(shí)采用了不同的技術(shù)。以下的段落介紹了這些區(qū)別。
Microsoft Excel 按照和向工具欄添加內(nèi)置控件相同的步驟來完成;在“類別”欄內(nèi),單擊“宏”,然后將“自定義按鈕” 控件拖到工具欄中希望它出現(xiàn)的位置上。在新控件上單擊鼠標(biāo)右鍵,然后點(diǎn)擊“指定宏”。在“指定宏”對(duì)話框中,選擇要運(yùn)行的宏。使用快捷菜單上的命令來改變控件的圖標(biāo)。
修改工具欄按鈕的外觀
按鈕在工具欄上的外觀既可以只是按鈕圖標(biāo),也可以只是按鈕名稱,或者是在名稱旁邊同時(shí)顯示按鈕圖標(biāo)。按鈕的“樣式”決定了按鈕是帶圖標(biāo)、還是只有名稱或者既有圖標(biāo)又有名稱。“自定義”對(duì)話框打開后,使用快捷菜單上的命令來設(shè)定按鈕的式樣。下表描述了式樣對(duì)工具欄按鈕的影響。
式 樣
按 鈕 的 外 觀
默認(rèn)式樣 只有圖標(biāo)按鈕
純文本(在菜單中) 只有按鈕圖標(biāo)
純文本(一般) 只有名字
圖標(biāo)和文本 圖標(biāo)按鈕和名字
當(dāng)打開“自定義”對(duì)話框時(shí),可以給工具欄按鈕添加或修改圖標(biāo)。下表列出了可以使用的技術(shù)。
目 的
做 法
使用預(yù)定義的圖標(biāo) 用鼠標(biāo)右鍵單擊該按鈕,指到“更改按鈕圖標(biāo)”,然后單擊要選擇的圖標(biāo)。
復(fù)制和粘貼另一個(gè)按鈕的圖標(biāo) 用鼠標(biāo)右鍵單擊被復(fù)制的圖標(biāo)所屬的按鈕,然后選擇“復(fù)制按鈕圖標(biāo)”。在自定義圖標(biāo)的按鈕上單擊鼠標(biāo)右鍵,然后選擇“粘貼按鈕圖標(biāo)”。
從圖形程序復(fù)制和粘貼 在圖形程序中,打開要復(fù)制的圖標(biāo)。選擇和復(fù)制該圖標(biāo)(最好是16x16象素的圖形)。切換回原應(yīng)用程序,單擊“粘貼按鈕圖標(biāo)”。
編輯按鈕的當(dāng)前圖標(biāo) 在按鈕上單擊鼠標(biāo)右鍵,然后選擇“編輯按鈕圖標(biāo)”。在“按鈕編輯器”中,可以改變圖標(biāo)的顏色和形狀,調(diào)整圖標(biāo)在控件上的位置,并且可以對(duì)修改進(jìn)行預(yù)覽。當(dāng)完成對(duì)圖標(biāo)的編輯后,單擊“確定”。
用按鈕的原始圖標(biāo)對(duì)命令進(jìn)行復(fù)位 在按鈕上單擊鼠標(biāo)右鍵,然后選擇“復(fù)位按鈕圖標(biāo)”。
可以使用分隔線按相關(guān)性對(duì)控件分組。分隔線本身不是控件;更確切地說,可以在工具欄的每個(gè)控件前都設(shè)置一條分隔線。可以使用“自定義”對(duì)話框設(shè)置某條命令是一組控件中的第一個(gè)控件。
在工具欄上開始一組按鈕
如果“自定義”對(duì)話框尚未打開,那么用鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果包含要進(jìn)行修改的控件的工具欄尚未出現(xiàn),那么在“工具欄”表的“工具欄”一欄內(nèi)該工具欄名字旁邊的復(fù)選框內(nèi)打上鉤。
在希望上方出現(xiàn)分隔線的控件上單擊鼠標(biāo)右鍵,任何選擇“開始一組”。
再次在該控件上單擊鼠標(biāo)右鍵,在快捷菜單上的“開始一組”旁邊顯示出一個(gè)對(duì)鉤。要去除在控件之前的分隔線,可以在該控件上單擊鼠標(biāo)右鍵然后再次選擇“開始一組”(不再出現(xiàn)對(duì)鉤)。
可以使用CommandBarControls集合的Add方法來向CommandBar對(duì)象添加新的控件,該對(duì)象表示某個(gè)特定的工具欄。要添加內(nèi)置控件,可以用Add方法的參數(shù)Id指示該命令的ID編號(hào)。在下面這個(gè)例子在“Quick Tools”工具欄里添加了控件“Spelling”。
Set mySpell = CommandBars("Quick Tools").Controls.Add(Id:=2)
要對(duì)如何決定Microsoft Office 應(yīng)用程序的內(nèi)置命令的ID編號(hào)做更多的了解,請參考本章后面的“菜單項(xiàng)和菜單欄控件ID編號(hào)”一節(jié)的內(nèi)容。
要添加自定義控件,可以先添加新的控件,然后設(shè)置OnAction 屬性來指定點(diǎn)擊該控件時(shí)運(yùn)行的Visual Basic程序。設(shè)置Add 法的參數(shù)Type為msoControlButton指出該控件是一個(gè)按鈕。設(shè)置該控件的FaceId值為一個(gè)內(nèi)置控件的ID,用以復(fù)制該內(nèi)置控件的外觀。在下面這個(gè)Microsoft Excel例子里,在常用工具欄的“保存”按鈕前添加了一個(gè)按鈕。當(dāng)用戶點(diǎn)擊該菜單項(xiàng)時(shí),Microsoft Excel 運(yùn)行Visual Basic程序OpenDatabaseProc。這個(gè);例子還設(shè)置按鈕上的圖標(biāo)是grid(ID 987)。
Set databaseItem = CommandBars("Standard").Controls. _
Add(Type:=msoControlButton, Before:=3)
With databaseItem
.OnAction:="OpenDatabaseProc"
.FaceId = 987
End With
用戶可以在Visual Basic 中設(shè)置表示工具欄按鈕的對(duì)象它的許多屬性,以此修改控件的外觀。要作更多的了解,請參考“幫助”中的Style屬性和FaceID 屬性,以及CommandBarButtion對(duì)象的其他屬性和方法的幫助主題。
設(shè)置開始一組控件的控件(也就是說,前面有一線條的控件),需要設(shè)置表示控件的CommandBarButton、CommandBarPopup或者CommandBarComboBox對(duì)象的BeginGroup屬性為True(真)。要去除該線條,則設(shè)置屬性BeginGroup為False(假)。使用Controls(Index),此處的索引是指控件的標(biāo)題或索引號(hào),來返回一個(gè)表示該控件的對(duì)象。。
添加和初始化文本框、列表框和組合框控件
可以通過“自定義”對(duì)話框添加內(nèi)置文本框、列表框和組合框控件。步驟和本節(jié)前面介紹的添加內(nèi)置控件的步驟相同。
添 加 控 件
指 定 類 型
文本框 msoControlEdit
列表框 msoControlDropDown
組合框 msoControlComboBox
可以使用文本框、列表框或組合框的Style屬性指明在該框的左邊是否顯示控件的標(biāo)題。
下面的例子向自定義工具欄添加了一個(gè)標(biāo)為“Quarter”的組合框,并且給該組合框指定了一個(gè)名為“ScrollToQuarter”的宏。
Set newCombo = CommandBars("Custom1").Controls _
.Add(Type:=msoControlComboBox)
With newCombo
.AddItem "Q1"
.AddItem "Q2"
.AddItem "Q3"
.AddItem "Q4"
.Style = msoComboNormal
.OnAction = "ScrollToQuarter"
End With
當(dāng)用戶的vba應(yīng)用程序運(yùn)行時(shí),在用戶每次改變組合框控件時(shí)都要調(diào)用指定到該控件的OnAction屬性中的過程。在該過程中,可以使用CommandBars對(duì)象的ActionControl屬性來發(fā)現(xiàn)被更改的控件并且返回被更改的值。ListIndex屬性返回輸入到組合框中的內(nèi)容。
刪除工具欄控件
刪除內(nèi)置工具欄控件能夠幫助用戶定制自己的vba應(yīng)用程序以滿足需要。例如,要從刪除工具欄中刪除一個(gè)內(nèi)置控件并且用該命令的自定義版本來替換它,新版本將執(zhí)行用戶的專門任務(wù)。抑或是要?jiǎng)h除某個(gè)控件以簡化界面或減少?zèng)]有經(jīng)驗(yàn)用戶選用不希望使用的那些命令的可能性。
注釋 可以恢復(fù)已經(jīng)被刪除的內(nèi)置工具欄或工具欄控件。但是,不能恢復(fù)已經(jīng)被刪除的自定義工具欄或工具欄控件;必須重新創(chuàng)建它們。
使用“自定義”對(duì)話框
在“自定義”對(duì)話框打開的情況下,可以刪除任何工具欄控件。
刪除工具欄控件
如果“自定義”對(duì)話框尚未打開,用鼠標(biāo)指到“視圖”菜單中的“工具欄”上,然后單擊“自定義”。
如果包含要?jiǎng)h除的工具欄控件的工具欄尚未顯示出來,在“工具欄”表的“工具欄”一欄內(nèi)該工具欄名字旁邊的復(fù)選框打上對(duì)鉤。
在要?jiǎng)h除的控件上單擊鼠標(biāo)右鍵,然后在快捷菜單中單擊“刪除”。
要?jiǎng)h除一個(gè)完整的自定義工具欄,可以打開“自定義”對(duì)話框,在“工具欄”表中的“工具欄”一欄內(nèi),選中該工具欄的名字,然后單擊“刪除”按鈕。但是不能刪除內(nèi)置工具欄。
可以使用Delete方法來刪除自定義工具欄以及自定義或內(nèi)置的工具欄控件。但不能刪除內(nèi)置工具欄。
以下Microsoft Excel中的例子從“常用”工具欄中刪除了“打印”控件。
CommandBars("Standard").Controls("Print").Delete
下面的例子刪除了名叫“Custom Bar”的自定義工具欄
CommandBars("Custom Bar").Delete
用戶也可以恢復(fù)已經(jīng)刪除的內(nèi)置工具欄控件。要做更多了解,請參考下一節(jié)的內(nèi)容。
恢復(fù)內(nèi)置工具欄控件
用戶可以恢復(fù)已經(jīng)刪除的內(nèi)置工具欄控件。但是,不能恢復(fù)已經(jīng)被刪除的自定義工具欄或工具欄控件;必須重新創(chuàng)建它們。
使用“自定義”對(duì)話框
用戶可以使用“自定義”對(duì)話框來恢復(fù)內(nèi)置工具欄中的內(nèi)置控件集合。
恢復(fù)內(nèi)置工具欄
如果“自定義”對(duì)話框尚未打開,則用鼠指向“視圖”菜單中的“工具欄”一項(xiàng),然后單擊“自定義”。
在“工具欄”表上,選擇要恢復(fù)的內(nèi)置工具欄。
單擊“恢復(fù)”。
使用Visual Basic
可以使用Reset方法來恢復(fù)內(nèi)置工具欄的組件。
以下Microsoft Excel中的例子恢復(fù)了“常用”工具欄的默認(rèn)控件集合。
CommandBars("Standard").Reset
對(duì)工具欄的運(yùn)行時(shí)刻修改
用戶可以對(duì)在設(shè)計(jì)時(shí)刻創(chuàng)建的工具欄進(jìn)行編程,使其那個(gè)在運(yùn)行時(shí)對(duì)條件的變化作出動(dòng)態(tài)響應(yīng)。如果一個(gè)特殊的控件在某個(gè)場合下不是合適的選擇,那么抑或可以刪除或者禁用該控件以防止用戶點(diǎn)中它。如果一個(gè)控件有兩種狀態(tài)來表示選項(xiàng),用戶可以采用在控件被按下時(shí)表示打開選項(xiàng),控件被放開時(shí)表示關(guān)閉選項(xiàng)。
注釋 雖然既可以使用“自定義”對(duì)話框也可以使用Visual Basic對(duì)工具欄進(jìn)行設(shè)計(jì)時(shí)刻修改,但是必須使用Visual Basic來進(jìn)行任何運(yùn)行時(shí)刻修改。
顯示或隱藏工具欄和工具欄控件
工具欄在屏幕上所占用的空間也可以以其他方式用來顯示日期;用戶可以在必要的時(shí)候顯示工具欄而在不再需要它的時(shí)候把它隱藏起來。工具欄在它的Visual 屬性為True(真)時(shí)是可見的,而在該屬性為False(假)時(shí)是不可見的。設(shè)置該屬性為True(真)就等價(jià)于,在“工具欄”對(duì)話框中的“工具欄”表里該工具欄名字旁邊的復(fù)選框內(nèi)打上對(duì)鉤,然后單擊“確定”。
下面的Microsoft Excel的過程指定給“視圖”菜單中的菜單項(xiàng)View MyToolbar,用戶每次點(diǎn)擊該菜單項(xiàng),就使該過程在菜單項(xiàng)和工具欄Visible屬性的兩種狀態(tài)之間進(jìn)行切換。當(dāng)工具欄重新出現(xiàn)時(shí),它所處的位置就是它隱藏不可見時(shí)的位置。
Sub ViewMyAppToolbar()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("View MyToolbar")
If .State = msoButtonUp Then
.State = msoButtonDown
CommandBars("MyAppTools").Visible = True
Else
.State = msoButtonUp
CommandBars("MyAppTools").Visible = False
End If
End With
End Sub
當(dāng)工具欄可見時(shí),用戶可以單擊上面的任何控件,運(yùn)行給控件指定的過程。
如果想要一個(gè)特定的工具欄只在某種條件存在時(shí)才出現(xiàn),那么可以在運(yùn)行時(shí)刻隱藏或顯示工具欄控件。通過設(shè)置Visible屬性為True(真)或False(假),能夠有效地向用戶工作區(qū)添加控件,或者從用戶工作區(qū)中去掉控件而不必真正地刪除該控件。
注釋 因?yàn)閃ord可以在文檔和模板中保存自定義信息,那么當(dāng)文檔或模板有效時(shí),就會(huì)顯示出自定義工具欄和工具欄控件,而當(dāng)文檔或模板無效時(shí),又會(huì)把它們隱藏起來。與此相對(duì)照,因?yàn)镸icrosoft Excel在工作簿級(jí)保存自定義信息,又會(huì)需要在事件代碼中使用Visible屬性來動(dòng)態(tài)地更改界面。
移動(dòng)工具欄及調(diào)整工具欄的大小
用戶可能希望在自己的應(yīng)用程序運(yùn)行時(shí)能夠隨著條件的改變來調(diào)整屏幕上工具欄的突出性。這可以通過改變工具欄的大小或位置來做到。用戶可以使用工具欄所支持的幾種屬性來對(duì)其進(jìn)行調(diào)整;將它們定位在應(yīng)用程序窗口的底部、底部、左邊或者右邊;或者將它們放在屏幕的隨便什么位置(如果它們是浮動(dòng)工具欄的話)。要對(duì)表示工具欄的CommandBar對(duì)象的屬性和方法作更多的了解,請參考“幫助”中的“CommandBar 對(duì)象”,使用標(biāo)題上的跳轉(zhuǎn)來顯示屬性和方法的列表。
恢復(fù)內(nèi)置工具欄
如果一個(gè)默認(rèn)工具欄已經(jīng)被修改了-被用戶或Vba過程-用戶能夠通過Reset方法將工具欄恢復(fù)到它的默認(rèn)狀態(tài)。使用該方法等價(jià)于,在“自定義”對(duì)話框中的“工具欄”一欄里選中被自定義的內(nèi)制工具欄的名字,然后單擊“確定”。
下面的例子將所有工具欄恢復(fù)到它們的默認(rèn)狀態(tài),同時(shí)刪除所了所有的自定義工具欄。
For Each cb In CommandBars
If cb.BuiltIn Then
cb.Reset
Else
cb.Delete
End If
Next
當(dāng)心 當(dāng)使用Reset方法時(shí)要小心;它不但能夠恢復(fù)任何被刪除的內(nèi)置工具欄控件,而且還會(huì)刪除任何添加的自定義工具欄控件。要牢牢記住,另一個(gè)宏可能已經(jīng)向工具欄添加了自定義工具欄,復(fù)位工具欄也會(huì)刪除這些控件。為了避免這些問題,應(yīng)該一個(gè)一個(gè)地刪除應(yīng)用程序所添加的工具欄控件,而不要復(fù)位整個(gè)工具欄。
啟用或禁用工具欄控件
用戶可能想在自己的應(yīng)用程序運(yùn)行時(shí)控制某個(gè)工具欄控件的可用性,以此來防止在不合適的時(shí)刻點(diǎn)中該按鈕。要做到這一點(diǎn),可以動(dòng)態(tài)地啟用或禁用工具欄控件。當(dāng)工具欄被禁用時(shí),點(diǎn)中它不會(huì)有什么反應(yīng),也不會(huì)運(yùn)行和它關(guān)聯(lián)的過程。使用Enable屬性來設(shè)置或返回工具欄控件的狀態(tài)(被啟用或被禁用)。
下面的例子禁用了“常用”工具欄中的第三個(gè)按鈕。
CommandBars("Standard").Controls(3).Enabled = False
指出工具欄控件的狀態(tài)
如果一個(gè)工具欄按鈕表示有著兩種狀態(tài)的一個(gè)選項(xiàng),可以通過改變按鈕的外觀來指出當(dāng)前選項(xiàng)的狀態(tài);當(dāng)選項(xiàng)打開時(shí),與之相關(guān)聯(lián)的按鈕顯示出被按下的狀態(tài);當(dāng)選項(xiàng)關(guān)閉時(shí),按鈕顯示被放開的狀態(tài)。
如果工具欄按鈕顯示出被按下的狀態(tài),工具欄按鈕的State屬性值為msoButtonDown;而如果工具欄按鈕顯示出被放開的狀態(tài),該屬性值為msoButtonUp。下面的過程被指定給新的工具欄控件Database View,在對(duì)工作簿的特殊查看間進(jìn)行切換之前,它能夠改變該控件的外觀。
Sub DatabaseView()
With CommandBars("MyAppToolbar").Controls(3)
If .State = msoButtonDown Then
.State = msoButtonUp
'Switch to database view
Else
.State = msoButtonDown
'Switch to worksheet view
End If
End With
End Sub
修改文本框、列表框和組合框控件
如果給工具欄添加了文本框、列表框或組合框控件,那么可以進(jìn)行運(yùn)行時(shí)刻更改,比如改變控件中文本框部分的當(dāng)前值、向控件的列表框中添加或從中刪除項(xiàng)(只適用于列表框和組合框)。
用戶能夠通過設(shè)置文本框、列表框或組合框控件的Text屬性,來反映自己的Visual Basic應(yīng)用程序的狀態(tài)。例如,如果單擊一個(gè)工具欄按鈕來運(yùn)行名為“MaxZoom”的過程(一個(gè)自定義過程,能夠以最大顯示比例顯示活動(dòng)文檔),組合框控件的文本框部分能夠更加精確地調(diào)整顯示比例,并且顯示出比例值,該比例值能夠被設(shè)置到最大值。
使用AddItem和RemoveItem方法來向列表框或組合框控件中的列表部分添加以及從中刪除項(xiàng)(通過索引編號(hào))。例如,如果在Word里創(chuàng)建了一個(gè)列表框,它遵循用戶在一個(gè)時(shí)段內(nèi)所使用的樣式,用戶可以在每次使用一種樣式時(shí)向控件的列表部分添加一種樣式的名稱。
注釋 在列表框或組合框控件里添加項(xiàng)或從中刪除項(xiàng)時(shí)要小心;這將導(dǎo)致所有項(xiàng)的索引編號(hào)發(fā)生移動(dòng)。
用戶可以使用列表框和組合框的其他屬性和方法來改變運(yùn)行時(shí)刻一個(gè)控件的外觀。例如,可以為控件添加和調(diào)整標(biāo)題列表(標(biāo)題列表是位于一個(gè)控件列表部分頂部的列表項(xiàng)組,用分隔線把該組同其他列表項(xiàng)分隔開)。要更進(jìn)一步了解文本框、列表框和組合框控件的使用,請參考“幫助”中“使用命令欄”的內(nèi)容。
菜單項(xiàng)和工具欄控件的IDs
每個(gè)內(nèi)置菜單欄和工具欄控件相關(guān)聯(lián)的功能都屬于某個(gè)特定的Office應(yīng)用程序,與此相反的是,每個(gè)菜單項(xiàng)和工具欄控件的標(biāo)題、按鈕圖標(biāo)、寬度以及其他默認(rèn)屬性都保存在能夠被所有應(yīng)用程序共享的資源中??梢允褂肐D編號(hào)從該資源中找出特定的菜單項(xiàng)和工具欄控件。
注釋 該資源還包含pop-up(彈出)控件的默認(rèn)屬性,該控件用來顯示內(nèi)置菜單。但是,那些pop-up(彈出)控件并不包含菜單中的內(nèi)置菜單項(xiàng);也就是說,pop-up(彈出)是空的。
雖然一般可以忽略一個(gè)菜單項(xiàng)或控件的ID,而是使用“自定義”對(duì)話框來更改內(nèi)置或自定義菜單和工具欄,但是仍然需要參考某項(xiàng)的ID來完成對(duì)用戶自定義界面的某些更改。以下是需要參考ID的以下場合。
要給一個(gè)內(nèi)置或自定義菜單或工具欄指派一項(xiàng),但是在設(shè)計(jì)時(shí)刻該項(xiàng)在“自定義”對(duì)話框中并不存在。
在運(yùn)行時(shí)刻向一個(gè)菜單欄或工具欄添加內(nèi)置項(xiàng)。
在運(yùn)行時(shí)刻將一個(gè)特定的按鈕圖標(biāo)復(fù)制到另一個(gè)按鈕。
可以為CommandBarControls 集合的Add方法中的參數(shù)Id指定一個(gè)內(nèi)置項(xiàng)ID,并且可以為任何自定義或內(nèi)置控件的FaceId 屬性指定一個(gè)項(xiàng)ID。
注釋 即使共享資源包含了所有Office應(yīng)用程序中的每個(gè)菜單項(xiàng)和工具欄控件的有關(guān)信息,用戶所添加的項(xiàng)和控件,它們的功能必須包含在用戶正在使用的應(yīng)用程序里面。例如,不能向Word中一個(gè)工具欄添加Microsoft Excel 的“刪除行”工具欄按鈕(ID 293)。但是,可以把“刪除行”工具欄按鈕的外觀從Microsoft Excel 復(fù)制到Word里給一個(gè)工具欄控件。
可以使用以下方法之一,來得到一個(gè)特定Office應(yīng)用程序中內(nèi)置菜單項(xiàng)和工具欄控件的ID編號(hào)。
在一個(gè)模塊中,編寫代碼把一個(gè)已經(jīng)存在于菜單或工具欄中的菜單項(xiàng)或工具欄控件賦值給一個(gè)對(duì)象變量,然后使用調(diào)試工具監(jiān)測該對(duì)象Id屬性的值。得到ID后,可以采用Add方法向另一個(gè)菜單或工具欄添加該菜單項(xiàng)或控件的副本,也可以通過把ID賦給另一個(gè)按鈕的FaceId 屬性來復(fù)制圖標(biāo)給另一個(gè)按鈕。
Run the following procedure in one of the Office applications to create a text document that lists the IDs and captions of all the built-in commands in that application.
在一個(gè)Office應(yīng)用程序中運(yùn)行以下過程,創(chuàng)建一個(gè)列出該應(yīng)用程序中所有內(nèi)置命令的ID和標(biāo)題的文本文檔。
Sub outputIDs()
Const maxId = 4000
Open "c:\ids.txt" For Output As #1
' Create a temporary command bar with every
' available item and control assigned to it.
Set cbr = CommandBars.Add("Temporary", msoBarTop, False, True)
For i = 1 To maxId
On Error Resume Next
cbr.Controls.Add Id:=i
Next
On Error GoTo 0
' Write the ID and caption of each control to the output file.
For Each btn In cbr.Controls
Write #1, btn.Id, btn.Caption
Next
' Delete the command bar and close the output file.
cbr.Delete
Close #1
End Sub
在一個(gè)Office應(yīng)用程序中運(yùn)行以下過程,創(chuàng)建一個(gè)自定義工具欄的集合,該集合包含了和Office里FaceId屬性的有效值數(shù)目同樣多的按鈕;每個(gè)按鈕的圖標(biāo)和工具提示文本被設(shè)置為其中的一個(gè)值。可以對(duì)內(nèi)置命令(見前面的過程)的ID編號(hào)和這些工具欄上某個(gè)按鈕的FaceId屬性值進(jìn)行交叉索引,反之亦然。
Sub MakeAllFaceIds()
'Make fourteen toolbars with 300 faces each.
'Note that maxId is greater than last valid ID, so
'error will occur when first invalid ID is used.
Const maxId = 3900
On Error GoTo realMax
For bars = 0 To 13
firstId = bars * 300
lastId = firstId + 299
Set tb = CommandBars.Add
For i = firstId To lastId
Set btn = tb.Controls.Add
btn.FaceId = i
btn.TooltipText = "FaceId = " & i
Next
tb.Name = ("Faces " & CStr(firstId) & " to " _
& CStr(lastId))
tb.Width = 591
tb.Visible = True
Next
'Delete the button that caused the error and set toolbar name
realMax:
btn.Delete
tb.Name = ("Faces " & CStr(firstId) & " to " _
& CStr(i - 1))
tb.Width = 591
tb.Visible = True
End Sub
注釋 內(nèi)置菜單pop-up(彈出)控件的ID編號(hào)在30002到30426之間。記住,這些ID編號(hào)返回的內(nèi)置菜單副本為空。