在前面的教程中,我們講到了窗體的主要屬性與事件,而本節(jié)我們主要講述窗體的一些窗口運(yùn)用。本節(jié)知識(shí)對(duì)于后面“多文檔文件”的創(chuàng)建非常重要,所以希望大家好好掌握。
一、添加窗體:
在 VB 中每創(chuàng)建一個(gè)新文件,自動(dòng)會(huì)生成一個(gè)新窗體,如果想在本窗體的基礎(chǔ)上再添加一個(gè)窗體,那么應(yīng)該如何做呢?
1、選擇工程/添加窗體命令,彈出如圖一的窗口:
圖一
2、選擇你需要的窗體,然后點(diǎn)按“打開(kāi)”就行了,結(jié)果可以在“工程”窗口中看到,如圖二:
圖二
二、清除窗體:
在“工程”窗口中選中欲被清除的窗體,然后鼠標(biāo)右鍵,在彈出的菜單中選擇“移除……”命令。如圖三:
圖三
三、窗體的顯示屬性:
多窗口文件,往往是啟動(dòng)時(shí)打開(kāi)主窗口,通過(guò)一些命令再打開(kāi)其他窗口,那么,如何對(duì)窗口是否顯示進(jìn)行設(shè)置呢?
1、選擇“工程/工程屬性”菜單命令,在彈出的窗口中找到“啟動(dòng)對(duì)象”,然后從中選擇文件打開(kāi)時(shí)的主窗口是哪個(gè),如圖四:
圖四
2、其他窗體的載入:
我們可以在主窗口中設(shè)置菜單或按鈕,并在該菜單或按鈕的代碼區(qū)輸入如下代碼:
Form2.Show 1
其中,Show 是顯示窗體的一種方法,1 是窗體的顯示模式即 Mode ,當(dāng)值為 0 即非模態(tài)窗體時(shí)(常態(tài)窗口),允許用戶在當(dāng)前程序中切換到其他窗口;當(dāng)值為 1 即模態(tài)窗體時(shí),用戶不能在各個(gè)窗口間切換。
3、窗體在程序中的三種狀態(tài):
未裝入:窗體沒(méi)進(jìn)入程序,不占用程序資源,可以通過(guò) Unload 方法卸載窗體。裝入但不顯示:可以用 Load 方法將窗體載入內(nèi)存,隨時(shí)準(zhǔn)備顯示。
顯示:用 Show 方法可以顯示窗體,如果窗體已裝入內(nèi)存,那么直接 Show ;如果窗體還沒(méi)裝入內(nèi)存,Show 可以先用 Load 的方法將窗體載入內(nèi)存,然后再顯示出來(lái)。
載入窗體:Load FormX
卸載窗體:Unload FormX
顯示窗體:FormX.Show Mode
再論窗體
除窗體設(shè)計(jì)原理以外,還需考慮應(yīng)用程序的開(kāi)始與結(jié)束。有一些技巧用于決定應(yīng)用程序啟動(dòng)時(shí)的外觀。熟悉應(yīng)用程序卸載時(shí)進(jìn)行的一些處理也很重要。
設(shè)置啟動(dòng)窗體
在缺省情況下,應(yīng)用程序中的第一個(gè)窗體被指定為啟動(dòng)窗體。應(yīng)用程序開(kāi)始運(yùn)行時(shí),此窗體就被顯示出來(lái)(因而最先執(zhí)行的代碼是該窗體的Form_Initialize 事件中的代碼)。如果想在應(yīng)用程序啟動(dòng)時(shí)顯示別的窗體,那么就得改變啟動(dòng)窗體。
要改變啟動(dòng)窗體,請(qǐng)按照以下步驟執(zhí)行:
1. 從“工程”菜單中,選取“工程屬性”。
2. 選取“一般”。
3. 在“啟動(dòng)對(duì)象”ListBox 中,選取要作為新啟動(dòng)窗體的窗體。
4. 選取“確定”。
沒(méi)有啟動(dòng)窗體時(shí)的啟動(dòng)
有時(shí)候也許要應(yīng)用程序啟動(dòng)時(shí)不加載任何窗體。例如:可能想先運(yùn)行裝入數(shù)據(jù)文件的代碼,然后再根據(jù)數(shù)據(jù)文件的內(nèi)容決定顯示幾個(gè)不同窗體中的哪一個(gè)。要做到這一點(diǎn),可在標(biāo)準(zhǔn)模塊中創(chuàng)建一個(gè)名為 Main 的子過(guò)程,如下面的例子所示。
Sub Main()
Dim intStatus As Integer
'調(diào)用一個(gè)函數(shù)過(guò)程來(lái)檢驗(yàn)用戶狀態(tài)。
intStatus = GetUserStatus
'根據(jù)狀態(tài)顯示某個(gè)啟動(dòng)窗體。
If intStatus = 1 Then
frmMain.Show
Else
frmPassword.Show
End If
這個(gè)過(guò)程必須是一個(gè)子過(guò)程,且不能在窗體模塊內(nèi)。欲將 Sub Main 過(guò)程設(shè)為啟動(dòng)對(duì)象,可從“工程”菜單中,選取“工程屬性”,再選“一般”,然后從“啟動(dòng)對(duì)象”框中選定“Sub Main”。
顯示啟動(dòng)時(shí)的快速顯示
如果啟動(dòng)時(shí)有一個(gè)較長(zhǎng)的執(zhí)行過(guò)程,例如要從數(shù)據(jù)庫(kù)中裝入大量數(shù)據(jù)或者要裝入一些大型位圖,這時(shí)可能希望在啟動(dòng)時(shí)給出一個(gè)快速顯示??焖亠@示是一種窗體,它通常顯示的是諸如應(yīng)用程序名,版權(quán)信息和一個(gè)簡(jiǎn)單的位圖等內(nèi)容。啟動(dòng) Visual Basic 時(shí)所顯示的屏幕就是一個(gè)快速顯示。
要顯示快速顯示,需用 Sub Main 過(guò)程作為啟動(dòng)對(duì)象,并用 Show 方法顯示該窗體:
Private Sub Main()
'顯示快速顯示。
frmSplash.Show
'在此處添加啟動(dòng)過(guò)程。
...
'顯示主窗體并卸載快速顯示。
frmMain.Show
Unload frmSplash
End Sub
當(dāng)一些啟動(dòng)例程正在執(zhí)行時(shí),快速顯示能吸引用戶的注意,造成應(yīng)用程序裝載很快的錯(cuò)覺(jué)。當(dāng)這些啟動(dòng)例程完成以后,可以裝入第一個(gè)窗體并使其快速顯示卸載。
對(duì)于快速顯示的設(shè)計(jì)來(lái)說(shuō),盡量簡(jiǎn)單為好。如果使用大量位圖或者大量控件,則快速顯示本身裝入將會(huì)變慢。
結(jié)束應(yīng)用程序
當(dāng)所有窗體都已關(guān)閉并且沒(méi)有代碼正在執(zhí)行時(shí),事件驅(qū)動(dòng)的應(yīng)用程序就停止運(yùn)行。如果最后一個(gè)可見(jiàn)窗體關(guān)閉時(shí)仍有隱藏窗體存在,那么,應(yīng)用程序表現(xiàn)為已經(jīng)結(jié)束了(因?yàn)闆](méi)有可見(jiàn)的窗體),可實(shí)際上應(yīng)用程序仍在繼續(xù)運(yùn)行,直至所有隱藏窗體都關(guān)閉為止。之所以出現(xiàn)這種情況,是因?yàn)閷?duì)已卸載窗體的屬性或控件的任何訪問(wèn),都將導(dǎo)致隱含地、不予顯示地加載那個(gè)窗體。
避免出現(xiàn)關(guān)閉應(yīng)用程序時(shí)的這類問(wèn)題,最好的辦法是確保所有的窗體都已卸載。如果有一個(gè)以上窗體,可以使用 Forms 集合和 Unload 語(yǔ)句。例如,在主窗體上可以用一個(gè)名為 cmdQuit 的命令按鈕退出程序。如果應(yīng)用程序只有一個(gè)窗體,則 Click 事件過(guò)程可簡(jiǎn)單為:
Private Sub cmdQuit_Click ()
Unload Me
End Sub
如果應(yīng)用程序使用多窗體,通過(guò)把代碼放入主窗體的 Unload 事件過(guò)程可以卸載這些窗體??梢允褂?Forms 集合確保找到并關(guān)閉所有窗體。下列代碼就是使用窗體集合來(lái)卸載所有窗體的:
Private Sub Form_Unload (Cancel As Integer)
Dim i as integer
'在窗體集合中循環(huán)并卸載每個(gè)窗體。
For i = Forms.Count - 1 to 0 Step - 1
Unload Forms(i)
Next
End Sub
有一些情況需要不顧現(xiàn)存窗體或?qū)ο蟮臓顟B(tài)而結(jié)束應(yīng)用程序。為此,VisualBasic 提供了 End 語(yǔ)句。
End 語(yǔ)句使應(yīng)用程序立即結(jié)束:在End語(yǔ)句之后的代碼不會(huì)執(zhí)行,也不會(huì)再有事件發(fā)生。特別是,Visual Basic將不執(zhí)行任何窗體的QueryUnload、Unload或 Terminate事件過(guò)程。對(duì)象的各個(gè)引用將被釋放,但如果定義有自己的類,Visual Basic 將不執(zhí)行由這些類所創(chuàng)建對(duì)象的Terminate事件。
除 End 語(yǔ)句以外,Stop語(yǔ)句可以暫停一個(gè)應(yīng)用程序。然而,Stop 語(yǔ)句只能在調(diào)試時(shí)使用,因?yàn)樗会尫艑?duì)象的引用。
詳細(xì)信息 關(guān)于 Stop 語(yǔ)句的信息,請(qǐng)參閱第十三章“調(diào)試代碼和處理錯(cuò)誤”中的“使用中斷模式”,以及《語(yǔ)言參考》的“Stop 語(yǔ)句”。關(guān)于窗體集合或者釋放對(duì)象引用的信息,請(qǐng)參閱第九章“用對(duì)象編程”。
在應(yīng)用程序中使用菜單
許多簡(jiǎn)單的應(yīng)用程序只由一個(gè)窗體和幾個(gè)控件組成,但是通過(guò)增加菜單可以增強(qiáng) Visual Basic 應(yīng)用程序的功能。這一節(jié)將介紹如何在應(yīng)用程序中創(chuàng)建菜單和使用菜單。
用菜單編輯器創(chuàng)建菜單
用菜單編輯器可以創(chuàng)建新的菜單和菜單欄、在已有的菜單上增加新命令、用自己的命令來(lái)替換已有的菜單命令以及修改和刪除已有的菜單和菜單欄。
要顯示菜單編輯器,請(qǐng):
從“工具”菜單上,選取“菜單編輯器”。
- 或者 -
在“工具欄”上單擊“菜單編輯器”按鈕。這就會(huì)打開(kāi)菜單編輯器,如圖 6.7 所示。
盡管大多數(shù)菜單控件屬性可用菜單編輯器設(shè)置,所有的菜單屬性在“屬性”窗口中也都是可用的。菜單控件的兩個(gè)最重要的屬性是:
Name——這是代碼中用來(lái)引用菜單控件的名字。
Caption——這是出現(xiàn)在控件上的文本。
菜單編輯器中的其它屬性,包括 Index、Checked 和 NegotiatePosition,在本章稍后介紹。
使用菜單編輯器中的列表框
菜單控件列表框(位于菜單編輯器的下部)列出當(dāng)前窗體的所有菜單控件。當(dāng)在標(biāo)題文本框中鍵入一個(gè)菜單項(xiàng)時(shí),該項(xiàng)也會(huì)出現(xiàn)在菜單控件列表框中。從列表框中選取一個(gè)已存在的菜單控件可以編輯該控件的屬性。
例如,圖 6.7 表明典型應(yīng)用程序中“文件”菜單的各種菜單控件。菜單控件在菜單控件列表框中的位置決定了該控件是菜單標(biāo)題、菜單項(xiàng)、子菜單標(biāo)題還是子菜單項(xiàng):
位于列表框中左側(cè)平齊的菜單控件作為菜單標(biāo)題顯示在菜單欄中。
列表框中被縮進(jìn)過(guò)的菜單控件,當(dāng)單擊其前導(dǎo)的菜單標(biāo)題時(shí)才會(huì)在該菜單上顯示。
一個(gè)縮進(jìn)過(guò)的菜單控件,如果后面還緊跟著再次縮進(jìn)的一些菜單控件,它就成為一個(gè)子菜單的標(biāo)題。在子菜單標(biāo)題以下縮進(jìn)的各個(gè)菜單控件,就成為該子菜單的菜單項(xiàng)。
一個(gè)以連字符 (-) 作為它的 Caption 屬性的菜單控件,作為一個(gè)分隔符條出現(xiàn)。分隔符條可把菜單項(xiàng)劃分成若干個(gè)邏輯組?! ∽⒁?如果菜單控件是一個(gè)菜單標(biāo)題、帶有子菜單項(xiàng)、被復(fù)選或無(wú)效、或者有一個(gè)快捷鍵,那么它就不能作為分隔符條。
要在菜單編輯器中創(chuàng)建菜單控件,請(qǐng)按照以下步驟執(zhí)行:
1. 選取該窗體
2. 從“工具”菜單中,選取“菜單編輯器”。- 或者 -在“工具欄”上單擊“菜單編輯器”按鈕。
3. 在“標(biāo)題”文本框中,為第一個(gè)菜單標(biāo)題鍵入希望在菜單欄上顯示的文本。如果希望某一字符成為該菜單項(xiàng)的訪問(wèn)鍵,也可以在該字符前面加上一個(gè) (&) 字符。在菜單中,這一字符會(huì)自動(dòng)加上一條下劃線。
菜單標(biāo)題文本顯示在菜單控件列表框中。
4. 在“名稱”文本框中,鍵入將用來(lái)在代碼中引用該菜單控件的名字。請(qǐng)參閱本章后面“菜單標(biāo)題與命名準(zhǔn)則”。
5. 單擊向左或向右箭頭按鈕,可以改變?cè)摽丶目s進(jìn)級(jí)。
6. 如果需要的話,還可以設(shè)置控件的其他屬性。這一工作可以在菜單編輯器中做,也可以以后在“屬性”窗口中做。
7. 選取“下一個(gè)”就可以再建一個(gè)菜單控件。- 或者 -單擊“插入”可以在現(xiàn)有的控件之間增加一個(gè)菜單控件。也可以單擊向上與向下的箭頭按鈕,在現(xiàn)有菜單控件之中移動(dòng)控件。
8. 如果窗體所有的菜單控件都已創(chuàng)建,選取“確定”可關(guān)閉菜單編輯器。創(chuàng)建的菜單標(biāo)題將顯示在窗體上。在設(shè)計(jì)時(shí),單擊一個(gè)菜單標(biāo)題可下拉其相應(yīng)的菜單項(xiàng)。
分隔菜單項(xiàng)
分隔符條作為菜單項(xiàng)間的一個(gè)水平行顯示在菜單上。在菜單項(xiàng)很多的菜單上,可以使用分隔符條將各項(xiàng)劃分成一些邏輯組。例如Visual Basic的“幫助”菜單,使用分隔符條將其菜單項(xiàng)分成三組,如圖 6.8 所示。
要在菜單編輯器中創(chuàng)建分隔符條,請(qǐng)按照以下步驟執(zhí)行:
1. 如果想在一現(xiàn)有菜單中增加一個(gè)分隔符條,選取“插入”,在想要分隔開(kāi)來(lái)的菜單項(xiàng)之間插入一個(gè)菜單控件。
2. 如有必要,單擊右箭頭按鈕使新菜單項(xiàng)縮進(jìn)到與它要隔開(kāi)的菜單項(xiàng)同級(jí)。
3. 在“標(biāo)題”文本框中鍵入一個(gè)連字符 (-)。
4. 設(shè)置“名稱”屬性。
5. 選取“確定”,關(guān)閉菜單編輯器。
注意 雖然分隔符條是當(dāng)作菜單控件來(lái)創(chuàng)建的,它們卻不能響應(yīng) Click 事件,而且也不能被選取。
賦值訪問(wèn)鍵和快捷鍵
通過(guò)定義訪問(wèn)鍵和快捷鍵可改進(jìn)鍵盤對(duì)菜單命令的訪問(wèn)。
訪問(wèn)鍵
訪問(wèn)鍵允許按下ALT鍵并打入一個(gè)指定字符來(lái)打開(kāi)一個(gè)菜單。一旦菜單打開(kāi),通過(guò)按下所賦值的字符(訪問(wèn)鍵)可選取控件。例如,按下 ALT + E 鍵可打開(kāi)“編輯”菜單,再按P鍵可選取“粘貼”菜單項(xiàng)。在菜單控件的標(biāo)題中,一個(gè)指定的訪問(wèn)鍵表現(xiàn)為一個(gè)帶下劃線的字母,如圖 6.9 所示。
要在菜單編輯器中給菜單控件賦值訪問(wèn)鍵,請(qǐng)按照以下步驟執(zhí)行:
1. 選取要賦值訪問(wèn)鍵的菜單項(xiàng)。
2. 在其“標(biāo)題”框中,在要作為訪問(wèn)鍵字符的前面直接鍵入一個(gè) (&) 字符。
例如,如果圖6.9所示的“編輯”菜單被打開(kāi),下列Caption屬性設(shè)置值響應(yīng)的對(duì)應(yīng)鍵。
注意 菜單中不能使用重復(fù)的訪問(wèn)鍵。如果多個(gè)菜單項(xiàng)使用同一個(gè)訪問(wèn)鍵,則該鍵將不起作用。例如,如果C同時(shí)是“剪切”和“復(fù)制”的訪問(wèn)鍵,那么,當(dāng)選取“編輯”菜單且鍵入C時(shí),則“復(fù)制”命令將被選,但只有按下ENTER鍵以后,應(yīng)用程序才會(huì)執(zhí)行該命令。而“剪切”命令根本不會(huì)執(zhí)行。
快捷鍵
快捷鍵按下時(shí)會(huì)立刻運(yùn)行一個(gè)菜單項(xiàng)。可以為頻繁使用的菜單項(xiàng)指定一個(gè)快捷鍵,它提供一種鍵盤單步的訪問(wèn)方法,而不是按住ALT鍵、再按菜單標(biāo)題訪問(wèn)字符,然后再按菜單項(xiàng)訪問(wèn)字符的三步方法。快捷鍵的賦值包括功能鍵與控制鍵的組合,如CTRL + F1鍵或CTRL + A鍵。它們出現(xiàn)在菜單中相應(yīng)菜單項(xiàng)的右邊,如圖6.10所示。
要對(duì)菜單項(xiàng)賦值快捷鍵,請(qǐng)按照以下步驟執(zhí)行:
1. 打開(kāi)“菜單編輯器”。
2. 選取該菜單項(xiàng)。
3. 在“快捷鍵”組合框中選取功能鍵或者鍵的組合。
要?jiǎng)h除快捷鍵賦值,應(yīng)選取列表頂部的“(none)”。
注意 快捷鍵將自動(dòng)出現(xiàn)在菜單上;因此,不需要在菜單編輯器的“標(biāo)題”框中鍵入 CTRL+key。
菜單標(biāo)題與命名準(zhǔn)則
為了與其它應(yīng)用程序保持一致,創(chuàng)建菜單時(shí)遵循所確立的命名準(zhǔn)則是一個(gè)好辦法。
設(shè)置 Caption 屬性
為菜單項(xiàng)進(jìn)行標(biāo)題賦值時(shí),應(yīng)當(dāng)盡量遵循下列準(zhǔn)則:
1.菜單中項(xiàng)目名稱應(yīng)當(dāng)唯一,但不同菜單中相似動(dòng)作項(xiàng)目可以重名。
2.項(xiàng)目名稱可以是單詞、復(fù)合詞或者多個(gè)詞。
3.每一個(gè)項(xiàng)目名稱都應(yīng)當(dāng)有一個(gè)用鍵盤選取命令的、一個(gè)唯一的記憶訪問(wèn)字符。訪問(wèn)字符應(yīng)當(dāng)是菜單標(biāo)題的第一個(gè)字母,除非別的字符更易記;兩個(gè)菜單標(biāo)題不能用同一個(gè)訪問(wèn)字符。關(guān)于指定訪問(wèn)鍵與快捷鍵的詳細(xì)信息,請(qǐng)參閱本章前面的“用菜單編輯器創(chuàng)建菜單”部分。
4.如果命令在完成之前還需要附加信息,則在其名稱后面應(yīng)當(dāng)有一個(gè)省略號(hào)(…),比如顯示一個(gè)對(duì)話框的命令(“另存為…”,“首選項(xiàng)…”) 。
5.項(xiàng)目名稱盡量簡(jiǎn)短。如果要使應(yīng)用程序本地化,那么,在外文版中字詞長(zhǎng)度會(huì)增加將近百分之三十,這樣也許沒(méi)有足夠空間列出各個(gè)菜單項(xiàng)。有關(guān)應(yīng)用程序本地化的更詳細(xì)內(nèi)容,請(qǐng)參閱第十六章“國(guó)際發(fā)行”。
菜單命名約定
為了使代碼更可讀和更易維護(hù),在菜單編輯器中設(shè)置 Name 屬性時(shí)遵循已確定的命名約定是一個(gè)好辦法。大多數(shù)命名約定規(guī)則都建議用前綴來(lái)標(biāo)識(shí)對(duì)象(即,對(duì)菜單控件用 mnu),其后緊跟頂層菜單的名稱(如 File)。對(duì)于子菜單,其后再緊跟該子菜單的標(biāo)題(如 mnuFileOpen)。
詳細(xì)信息 有關(guān)所建議的命名約定的示例,請(qǐng)參閱附錄 B“Visual Basic 編碼約定”。有關(guān)所建議的命名約定的示例,請(qǐng)參閱“Visual Basic 編碼約定”。
創(chuàng)建子菜單
所創(chuàng)建的每個(gè)菜單可以包含最多五級(jí)子菜單。子菜單會(huì)分支出另一個(gè)菜單以顯示它自己的菜單項(xiàng)。需使用子菜單的場(chǎng)合有:
菜單欄已滿。
某一特定菜單控件很少被用到。
要突出某一菜單控件與另一個(gè)的關(guān)系。
然而,如果菜單欄中還有空間,最好再創(chuàng)建一個(gè)菜單標(biāo)題而不是子菜單。這樣,當(dāng)菜單拉下時(shí)所有控件都可見(jiàn)。限制使用子菜單也是一種好的編程策略,它可以免去查找應(yīng)用程序菜單界面的負(fù)擔(dān)(大多數(shù)應(yīng)用程序都只使用一級(jí)子菜單)。
在菜單編輯器中,在不是菜單標(biāo)題的菜單控件之下縮進(jìn)的任何菜單控件,都是子菜單控件。一般來(lái)說(shuō),子菜單控件可以包括子菜單項(xiàng)、分隔符條和子菜單標(biāo)題。
要?jiǎng)?chuàng)建子菜單,請(qǐng)按照以下步驟執(zhí)行:
1. 創(chuàng)建想作為子菜單標(biāo)題的菜單項(xiàng)。
2. 創(chuàng)建將出現(xiàn)在新子菜單中的各個(gè)項(xiàng)目,然后單擊右箭頭按鈕將它們縮進(jìn)。
在菜單編輯器中每一縮進(jìn)級(jí)前都加了四個(gè)點(diǎn) (....)。要?jiǎng)h除一縮進(jìn)級(jí),單擊左箭頭按鈕。
注意 如果想用多于一級(jí)的子菜單,可以考慮使用對(duì)話框來(lái)替代。對(duì)話框允許在一個(gè)地方指定好幾個(gè)選擇。關(guān)于使用對(duì)話框的內(nèi)容,請(qǐng)參閱本章后面的“對(duì)話框”。
創(chuàng)建菜單控件數(shù)組
菜單控件數(shù)組就是在同一菜單上共享相同名稱和事件過(guò)程的菜單項(xiàng)目的集合。菜單控件數(shù)組使用于:
在運(yùn)行時(shí)要?jiǎng)?chuàng)建一個(gè)新菜單項(xiàng),它必須是控件數(shù)組中的成員。如 MDINotepad 示例,它就用一個(gè)菜單控件數(shù)組來(lái)存儲(chǔ)新近打開(kāi)的文件清單。
簡(jiǎn)化代碼,因?yàn)橥ㄓ么a塊可以被所有菜單項(xiàng)使用。
每個(gè)菜單控件數(shù)組元素都由唯一的索引值來(lái)標(biāo)識(shí),該值在菜單編輯器上“Index 屬性框”中指定。當(dāng)一個(gè)控件數(shù)組成員識(shí)別一個(gè)事件時(shí),Visual Basic將其 Index 屬性值作為一個(gè)附加的參數(shù)傳遞給事件過(guò)程。事件過(guò)程必須包含有核對(duì) Index 屬性值的代碼,因而可以判斷出正在使用的是哪一個(gè)控件。
詳細(xì)信息 關(guān)于控件數(shù)組的詳細(xì)信息,請(qǐng)參閱第七章“使用 Visual Basic 的標(biāo)準(zhǔn)控件”中的“使用控件數(shù)組”。要在菜單編輯器中創(chuàng)建菜單控件數(shù)組,請(qǐng)按照以下步驟執(zhí)行:
1. 選取窗體。
2. 從“工具”菜單中,選取“菜單編輯器”。
- 或 -
在“工具欄”上單擊“菜單編輯器”按鈕。
3. 在“標(biāo)題”文本框中,鍵入想出現(xiàn)在菜單欄中的第一個(gè)菜單標(biāo)題的文本。菜單標(biāo)題文本顯示在菜單控件列表框中。
4. 在“名稱”文本框中,鍵入將在代碼中用來(lái)引用菜單控件的名稱。保持“索引”框是空的。
5. 在下一個(gè)縮進(jìn)級(jí),通過(guò)設(shè)定“標(biāo)題”和“名稱”來(lái)創(chuàng)建將成為數(shù)組中第一個(gè)元素的菜單項(xiàng)。
6. 將數(shù)組中第一個(gè)元素的“索引”設(shè)置為 0。
7. 在第一個(gè)的同一縮進(jìn)級(jí)上創(chuàng)建第二個(gè)菜單項(xiàng)。
8. 將第二個(gè)元素的“名稱”設(shè)置成與第一個(gè)元素相同,且把它的“索引”設(shè)置為 1。
9. 對(duì)于數(shù)組中的后續(xù)元素重復(fù)步驟 5- 8。
重點(diǎn) 菜單控件數(shù)組的各元素在菜單控件列表框中必須是連續(xù)的,而且必須在同一縮進(jìn)級(jí)上。創(chuàng)建菜單控件數(shù)組時(shí),要把在菜單中出現(xiàn)的分隔符條也包括進(jìn)去。
運(yùn)行時(shí)創(chuàng)建和修改菜單
設(shè)計(jì)時(shí)創(chuàng)建的菜單也能動(dòng)態(tài)地響應(yīng)運(yùn)行時(shí)的條件。例如,如果菜單項(xiàng)的動(dòng)作在某些點(diǎn)上成為不適當(dāng)時(shí),通過(guò)使其失效可防止對(duì)該菜單項(xiàng)的選取。比如:在 MDI NotePad 應(yīng)用程序中,如果剪貼板上沒(méi)有任何文本,則“編輯”菜單中的“粘貼”菜單項(xiàng)變暗,因而就不能被選。
如果有一個(gè)菜單控件數(shù)組,也可以動(dòng)態(tài)地增加菜單項(xiàng)。這將在本主題后面的“運(yùn)行時(shí)添加菜單控件”中講述。
也可以編寫(xiě)應(yīng)用程序,使用復(fù)選標(biāo)志來(lái)指示幾個(gè)命令中的哪一個(gè)是最后選取的。例如:如果工具欄被顯示,MDI NotePad 應(yīng)用程序工具欄的“選項(xiàng)”菜單項(xiàng)就會(huì)顯示一個(gè)復(fù)選標(biāo)志。本節(jié)描述的其它菜單控件功能包括使菜單項(xiàng)可見(jiàn)或不可見(jiàn)以及增加或刪除菜單項(xiàng)操作的代碼。
使菜單命令有效或無(wú)效
所有的菜單控件都具有 Enabled 屬性,當(dāng)這個(gè)屬性設(shè)為 False 時(shí),菜單命令無(wú)效使它不響應(yīng)動(dòng)作。當(dāng) Enabled 設(shè)為 False 時(shí),快捷鍵的訪問(wèn)也無(wú)效。一個(gè)無(wú)效的菜單控件會(huì)變暗,如圖 6.11 所示的“粘貼”菜單項(xiàng)。
例如:下列語(yǔ)句使 MDI NotePad 應(yīng)用程序中“編輯”菜單上的“粘貼”菜單項(xiàng)無(wú)效。
mnuEditPaste.Enabled = False
菜單標(biāo)題的無(wú)效使得整個(gè)菜單無(wú)效,因?yàn)椴皇紫葐螕舨藛螛?biāo)題,就不能訪問(wèn)任何菜單項(xiàng)。例如:下列代碼將使 MDI NotePad 應(yīng)用程序的“編輯”菜單無(wú)效。
mnuEdit.Enabled = False
顯示菜單控件上的復(fù)選標(biāo)志
使用 Checked 屬性,可以把一個(gè)復(fù)選標(biāo)志放置在菜單上,以便:
表示打開(kāi)/關(guān)閉條件的狀態(tài)。選取菜單命令可交替地增加和刪除此復(fù)選標(biāo)志。
指示幾個(gè)模式中哪一個(gè)正在起作用。MDI NotePad 應(yīng)用程序的“選項(xiàng)”菜單使用復(fù)選標(biāo)志來(lái)指示工具欄的狀態(tài),如圖 6.12 所示。
在 Visual Basic 中可以用 Checked 屬性來(lái)創(chuàng)建復(fù)選標(biāo)志。通過(guò)選取被標(biāo)記為 Checked 的復(fù)選框來(lái)設(shè)置菜單編輯器中的 Checked 屬性的初始值。在運(yùn)行時(shí)要從一個(gè)菜單控件上增加或刪除復(fù)選標(biāo)志,可以從代碼中設(shè)置它的Checked 屬性。例如:
Private Sub mnuOptions_Click ()
'根據(jù) Visible 屬性設(shè)置復(fù)選標(biāo)志的狀態(tài)。
mnuOptionsToolbar.Checked = picToolbar.Visible
End Sub
使菜單控件不可見(jiàn)
在菜單編輯器中,通過(guò)選取被標(biāo)記為 Visible 的復(fù)選框,可以設(shè)置菜單控件的 Visible 屬性的初值。在運(yùn)行時(shí),要使一個(gè)菜單控件可見(jiàn)或不可見(jiàn),可以從代碼中設(shè)置其 Visible 屬性。例如:
mnuFileArray(0).Visible = True ' 使控件可見(jiàn)。
mnuFileArray(0).Visible = False ' 使控件不可見(jiàn)。
當(dāng)一個(gè)菜單控件不可見(jiàn)時(shí),菜單中的其余控件會(huì)上移以填補(bǔ)空出的空間。如果控件位于菜單欄上,則菜單欄上其余的控件會(huì)左移以填補(bǔ)該空間。
注意 使菜單控件不可見(jiàn)也產(chǎn)生使之無(wú)效的作用,因?yàn)樵摽丶ㄟ^(guò)菜單、訪問(wèn)鍵或者快捷鍵都再無(wú)法訪問(wèn)。如果菜單標(biāo)題不可見(jiàn),則該菜單上所有控件均無(wú)效。
運(yùn)行時(shí)添加菜單控件
運(yùn)行時(shí)菜單可以增長(zhǎng)。例如:在圖 6.13 中 作為 SDI NotePad 應(yīng)用程序中被打開(kāi)的文件,會(huì)動(dòng)態(tài)地創(chuàng)建菜單項(xiàng)來(lái)顯示剛打開(kāi)文件的路徑名。
運(yùn)行時(shí)為了創(chuàng)建控件必須使用控件數(shù)組。因?yàn)樵O(shè)計(jì)時(shí)對(duì)mnuRecentFile菜單控件的 Index 屬性進(jìn)行了賦值,它自動(dòng)地成為控件數(shù)組的一個(gè)元素——即使還沒(méi)有創(chuàng)建其它元素。
當(dāng)創(chuàng)建 mnuRecentFile(0) 時(shí),實(shí)際上創(chuàng)建了一個(gè)在運(yùn)行時(shí)不可見(jiàn)的分隔符條。當(dāng)運(yùn)行時(shí)用戶第一次存儲(chǔ)一個(gè)文件時(shí),這個(gè)分隔符條就會(huì)變得可見(jiàn),且第一個(gè)文件名被加到該菜單上。運(yùn)行時(shí)每存儲(chǔ)一個(gè)文件,則會(huì)再裝入一個(gè)菜單控件到該數(shù)組中,從而使該菜單增長(zhǎng)。
運(yùn)行時(shí)所創(chuàng)建的控件可以使用 Hide 方法或者設(shè)置該控件的 Visible 屬性為False 來(lái)隱藏。如果要從內(nèi)存中刪除一個(gè)控件數(shù)組中的控件,請(qǐng)使用 Unload語(yǔ)句。
編寫(xiě)菜單控件的代碼
當(dāng)用戶選取一個(gè)菜單控件時(shí),一個(gè) Click 事件出現(xiàn)。需要在代碼中為每個(gè)菜單控件編寫(xiě)一個(gè) Click 事件過(guò)程。除分隔符條以外的所有菜單控件(以及無(wú)效的或不可見(jiàn)的菜單控件)都能識(shí)別 Click 事件。
在菜單事件過(guò)程中編寫(xiě)的代碼與在控件任何其它事件過(guò)程中編寫(xiě)的代碼完全相同。例如:“文件”菜單中的“關(guān)閉”菜單項(xiàng)的 Click 事件的代碼看上去如下:
Sub mnuFileClose_Click()
Unload Me
End Sub
一旦菜單標(biāo)題被選取,Visual Basic 將自動(dòng)地顯示出一個(gè)菜單;但是,沒(méi)有必要為一個(gè)菜單標(biāo)題的 Click 事件過(guò)程編寫(xiě)代碼,除非想執(zhí)行其它操作,比如每次顯示菜單時(shí)使某些菜單項(xiàng)無(wú)效。
注意 在設(shè)計(jì)時(shí),當(dāng)關(guān)閉菜單編輯器時(shí),所創(chuàng)建的菜單將顯示在窗體上。在窗體上選取一個(gè)菜單項(xiàng)將顯示那個(gè)菜單控件的 Click 事件過(guò)程。
顯示彈出式菜單
彈出式菜單是獨(dú)立于菜單欄而顯示在窗體上的浮動(dòng)菜單。在彈出式菜單上顯示的項(xiàng)目取決于按下鼠標(biāo)右鍵時(shí)指針?biāo)幍奈恢?;因而,彈出式菜單也被稱為上下文菜單。
在 Microsoft Windows 95 中,可以通過(guò)單擊鼠標(biāo)右鍵來(lái)激活上下文菜單。在運(yùn)行時(shí),至少含有一個(gè)菜單項(xiàng)的任何菜單都可以作為彈出式菜單被顯示。為了顯示彈出式菜單,可使用 PopupMenu 方法。這個(gè)方法使用下列語(yǔ)法:
[object.]PopupMenu menuname [, flags [,x [, y [, boldcommand ]]]]
例如:當(dāng)用戶用鼠標(biāo)右鍵單擊一個(gè)窗體時(shí),以下的代碼顯示一個(gè)名為 mnuFile的菜單??捎?MouseUp 或者 MouseDown 事件來(lái)檢測(cè)何時(shí)單擊了鼠標(biāo)右鍵,雖然標(biāo)準(zhǔn)用法是使用 MouseUp 事件:
Private Sub Form_MouseUp (Button As Integer, Shift As _
Integer, X As Single, Y As Single)
If Button = 2 Then ' 檢查是否單擊了鼠標(biāo)右鍵。
PopupMenu mnuFile ' 把文件菜單顯示為一個(gè)彈出式菜單。
End If
End Sub
直到菜單中被選取一項(xiàng)或者取消這個(gè)菜單時(shí),調(diào)用 PopupMenu 方法后面的代碼才會(huì)運(yùn)行。
注意 每次只能顯示一個(gè)彈出式菜單。在已顯示一個(gè)彈出式菜單的情況下,對(duì)后面的調(diào)用 PopupMenu 方法將不予理睬。在一個(gè)菜單控件正活動(dòng)的任何時(shí)刻,調(diào)用 PopupMenu 方法均不會(huì)被理睬。
常常會(huì)想用一個(gè)彈出式菜單來(lái)訪問(wèn)那些在菜單欄中不常用的選項(xiàng)。為創(chuàng)建一個(gè)不顯示在菜單欄里的菜單,可在設(shè)計(jì)時(shí)使頂級(jí)菜單項(xiàng)目為不可見(jiàn)(保證在菜單編輯器里的“Visible”復(fù)選框沒(méi)有被選上)。當(dāng) Visual Basic 顯示一個(gè)彈出式菜單時(shí),指定的頂級(jí)菜單的 Visible 屬性會(huì)被忽略。
Flags 參數(shù)
在PopupMenu 方法中使用 flags 參數(shù)可以進(jìn)一步定義彈出式菜單的位置與性能。下表列出了可用于描述彈出式菜單位置的標(biāo)志。
想要指定一個(gè)標(biāo)志,從每組中選取一個(gè)常數(shù),再用 Or 操作符將它們連起來(lái)。下面的代碼是,當(dāng)用戶單擊一個(gè)命令按鈕時(shí),顯示一個(gè)上邊框在窗體中心的彈出式菜單。彈出式菜單觸發(fā)受到鼠標(biāo)右鍵或左鍵單擊的菜單項(xiàng)的Click 事件。
Private Sub Command1_Click ()
' X 變量和 Y 變量的尺寸。
Dim xloc, yloc
'設(shè)置 X 變量和 Y 變量到窗體中心。
xloc = ScaleWidth / 2
yloc = ScaleHeight / 2
'顯示彈出式菜單。
PopupMenu mnuEdit, vbPopupMenuCenterAlign Or _
vbPopupMenuRightButton, xloc, yloc
End Sub
Boldcommand 參數(shù)
使用 boldcommand 參數(shù)來(lái)指定在顯示的彈出式菜單中想以粗體字體出現(xiàn)的菜單控件的名稱。在彈出式菜單中只能有一個(gè)菜單控件被加粗。
MDI 應(yīng)用程序中的菜單
在 MDI 應(yīng)用程序中,每一個(gè)子窗體的菜單都顯示在 MDI 窗s體上,而不是在子窗體本身。當(dāng)子窗體有焦點(diǎn)時(shí),該子窗體的菜單(如果有的話)就代替菜單欄上的 MDI 窗體的菜單。如果沒(méi)有可見(jiàn)的子窗體,或者如果帶有焦點(diǎn)的子窗體沒(méi)有菜單,則顯示 MDI 窗體的菜單(見(jiàn)圖 6.14 和 6.15)。MDI 應(yīng)用程序使用幾套菜單的情況很普遍。當(dāng)打開(kāi)一個(gè)文檔時(shí),應(yīng)用程序顯示與該類文檔相關(guān)的菜單。通常,當(dāng)沒(méi)有可見(jiàn)子窗體時(shí),會(huì)顯示一個(gè)不同的菜單。例如,當(dāng)沒(méi)有文件打開(kāi)時(shí),Microsoft Excel 只顯示“文件”與“幫助”菜單。當(dāng)用戶打開(kāi)一個(gè)文件時(shí),其他菜單就會(huì)顯示出來(lái)(“文件”、“編輯”、“視圖”、“插入”、“格式”、“工具”、“數(shù)據(jù)”和“窗口”等等)。
創(chuàng)建 MDI 應(yīng)用程序的菜單
通過(guò)給 MDI 窗體和子窗體添加菜單控件,可以為 Visual Basic 應(yīng)用程序創(chuàng)建菜單。管理 MDI 應(yīng)用程序中菜單的一個(gè)方法是把希望在任何時(shí)候都顯示的菜單控件放在 MDI 窗體上(即使沒(méi)有子窗體可見(jiàn)時(shí))。當(dāng)運(yùn)行該應(yīng)用程序時(shí),如果沒(méi)有可見(jiàn)的子窗體,會(huì)自動(dòng)顯示 MDI 窗體菜單,如圖 6.14所示。
把應(yīng)用于子窗體的菜單控件放置到子窗體中。在運(yùn)行時(shí),只要有一個(gè)子窗體可見(jiàn),這些菜單標(biāo)題就會(huì)顯示在 MDI 窗體的菜單欄中。
有些應(yīng)用程序支持多種類型的文檔。例如,在 Microsoft Access 中,可以打開(kāi)表格、查詢、窗體和其它文檔類型。要在 Visual Basic 中創(chuàng)建這樣的應(yīng)用程序,應(yīng)使用兩個(gè)子窗體。設(shè)計(jì)一個(gè)帶有執(zhí)行工作單任務(wù)菜單的子窗體和另一個(gè)帶有完成圖表任務(wù)菜單的子窗體。
在運(yùn)行時(shí),當(dāng)工作單窗體的實(shí)例有焦點(diǎn)時(shí),則顯示工作單菜單,而當(dāng)選取圖表時(shí),則顯示圖表窗體的菜單。如果所有的工作單和圖表都關(guān)閉,則顯示 MDI 窗體的菜單。關(guān)于創(chuàng)建菜單的詳細(xì)內(nèi)容,請(qǐng)參閱本章前面的“在應(yīng)用程序中使用菜單”部分。
創(chuàng)建“窗口”菜單
大多數(shù) MDI 應(yīng)用程序(例如:Microsoft Word for Windows 與 MicrosoftExcel)都結(jié)合了“窗口”菜單。這是一個(gè)顯示所有打開(kāi)的子窗體標(biāo)題的特殊菜單,如圖 6.15 所示。另外,有些應(yīng)用程序?qū)⒉倏v子窗體的命令,比如“層疊”、“平鋪”與“排列圖標(biāo)”,放在這個(gè)菜單中。
在 MDI 窗體或者 MDI 子窗體上的任何菜單控件,只要將其 WindowList屬性設(shè)置為 True,都可以用于顯示打開(kāi)子窗體的清單。在運(yùn)行時(shí),VisualBasic 自動(dòng)管理與顯示標(biāo)題清單,并在當(dāng)前正有焦點(diǎn)的標(biāo)題旁邊顯示一個(gè)復(fù)選標(biāo)志。另外,在窗口清單的上方自動(dòng)放置一個(gè)分隔符條。
要設(shè)置 WindowList 屬性,請(qǐng)按照以下步驟執(zhí)行:
1. 選取希望菜單出現(xiàn)其上的窗體,從“工具”菜單中,選取“菜單編輯器”。
注意 WindowList 屬性只應(yīng)用于 MDI 窗體和 MDI 子窗體。它對(duì)標(biāo)準(zhǔn)窗體(非 MDI)不起作用。
2. 在菜單編輯器列表框中,選取希望打開(kāi)的子窗體的清單顯示在其上的菜單。
3. 選取“WindowList”復(fù)選框。
在運(yùn)行時(shí),這個(gè)菜單顯示打開(kāi)的子窗體的清單。另外,這個(gè)菜單控件的WindowList 屬性返回 True。
詳細(xì)信息 請(qǐng)參閱《語(yǔ)言參考》的“WindowList 屬性”。
排列子窗體
就像前面所提到的,有些應(yīng)用程序把諸如平鋪 (Tile)、層疊 (Cascade) 與排列圖標(biāo) (Arrange Icons) 等操作列在和打開(kāi)的子窗體列表的同一個(gè)菜單上。在 MDI 窗體中使用 Arrange 方法來(lái)重新對(duì)齊子窗體??梢詫盈B、水平平鋪或者沿著 MDI 窗體的下部排列的子窗體圖標(biāo)等方式來(lái)顯示子窗體。下面的實(shí)例示出了“層疊”、“平鋪”和“排列圖標(biāo)”菜單控件的 Click 事件過(guò)程。
Private Sub mnuWCascade_Click ()
'層疊子窗體。
frmMDI.Arrange vbCascade
End Sub
Private Sub mnuWTile_Click ()
'平鋪?zhàn)哟绑w。
frmMDI.Arrange vbTileHorizontal
End Sub
Private Sub mnuWArrange_Click ()
'排列所有子窗體圖標(biāo)。
frmMDI.Arrange vbArrangeIcons
End Sub
注意 內(nèi)部常數(shù) vbCascade、vbTileHorizontal 和 vbArrangeIcons 都在對(duì)象瀏覽器的 Visual Basic (VB) 對(duì)象庫(kù)中列出。
當(dāng)平鋪或者層疊有著固定邊框類型的子窗體時(shí),每個(gè)子窗體都像具有可變尺寸邊框那樣被定位。這使得子窗體可能重疊。
聯(lián)系客服