再論窗體
除窗體設計原理以外,還需考慮應用程序的開始與結束。有一些技巧用於決定應用程序啟動時的外觀。熟悉應用程序卸載時進行的一些處理也很重要。
設置啟動窗體
在缺省情況下,應用程序中的第一個窗體被指定為啟動窗體。應用程序開始運行時,此窗體就被顯示出來(因而最先執行的代碼是該窗體的Form_Initialize 事件中的代碼)。如果想在應用程序啟動時顯示別的窗體,那麼就得改變啟動窗體。
要改變啟動窗體,請按照以下步驟執行:
1. 從“工程”菜單中,選取“工程屬性”。
2. 選取“一般”。
3. 在“啟動對象”ListBox 中,選取要作為新啟動窗體的窗體。
4. 選取“確定”。
沒有啟動窗體時的啟動
有時候也許要應用程序啟動時不加載任何窗體。例如:可能想先運行裝入數據文件的代碼,然後再根據數據文件的內容決定顯示幾個不同窗體中的哪一個。要做到這一點,可在標准模塊中創建一個名為 Main 的子過程,如下面的例子所示。
Sub Main()
Dim intStatus As Integer
'調用一個函數過程來檢驗用戶狀態。
intStatus = GetUserStatus
'根據狀態顯示某個啟動窗體。
If intStatus = 1 Then
frmMain.Show
Else
frmPassword.Show
End If
這個過程必須是一個子過程,且不能在窗體模塊內。欲將 Sub Main 過程設為啟動對象,可從“工程”菜單中,選取“工程屬性”,再選“一般”,然後從“啟動對象”框中選定“Sub Main”。
顯示啟動時的快速顯示
如果啟動時有一個較長的執行過程,例如要從數據庫中裝入大量數據或者要裝入一些大型位圖,這時可能希望在啟動時給出一個快速顯示。快速顯示是一種窗體,它通常顯示的是諸如應用程序名,版權信息和一個簡單的位圖等內容。啟動 Visual Basic 時所顯示的屏幕就是一個快速顯示。
要顯示快速顯示,需用 Sub Main 過程作為啟動對象,並用 Show 方法顯示該窗體:
Private Sub Main()
'顯示快速顯示。
frmSplash.Show
'在此處添加啟動過程。
...
'顯示主窗體並卸載快速顯示。
frmMain.Show
Unload frmSplash
End Sub
當一些啟動例程正在執行時,快速顯示能吸引用戶的注意,造成應用程序裝載很快的錯覺。當這些啟動例程完成以後,可以裝入第一個窗體並使其快速顯示卸載。
對於快速顯示的設計來說,盡量簡單為好。如果使用大量位圖或者大量控件,則快速顯示本身裝入將會變慢。
結束應用程序
當所有窗體都已關閉並且沒有代碼正在執行時,事件驅動的應用程序就停止運行。如果最後一個可見窗體關閉時仍有隱藏窗體存在,那麼,應用程序表現為已經結束了(因為沒有可見的窗體),可實際上應用程序仍在繼續運行,直至所有隱藏窗體都關閉為止。之所以出現這種情況,是因為對已卸載窗體的屬性或控件的任何訪問,都將導致隱含地、不予顯示地加載那個窗體。
避免出現關閉應用程序時的這類問題,最好的辦法是確保所有的窗體都已卸載。如果有一個以上窗體,可以使用 Forms 集合和 Unload 語句。例如,在主窗體上可以用一個名為 cmdQuit 的命令按鈕退出程序。如果應用程序只有一個窗體,則 Click 事件過程可簡單為:
Private Sub cmdQuit_Click ()
Unload Me
End Sub
如果應用程序使用多窗體,通過把代碼放入主窗體的 Unload 事件過程可以卸載這些窗體。可以使用 Forms 集合確保找到並關閉所有窗體。下列代碼就是使用窗體集合來卸載所有窗體的:
Private Sub Form_Unload (Cancel As Integer)
Dim i as integer
'在窗體集合中循環並卸載每個窗體。
For i = Forms.Count - 1 to 0 Step - 1
Unload Forms(i)
Next
End Sub
有一些情況需要不顧現存窗體或對象的狀態而結束應用程序。為此,VisualBasic 提供了 End 語句。
End 語句使應用程序立即結束:在End語句之後的代碼不會執行,也不會再有事件發生。特別是,Visual Basic將不執行任何窗體的QueryUnload、Unload或 Terminate事件過程。對象的各個引用將被釋放,但如果定義有自己的類,Visual Basic 將不執行由這些類所創建對象的Terminate事件。
除 End 語句以外,Stop語句可以暫停一個應用程序。然而,Stop 語句只能在調試時使用,因為它不釋放對象的引用。
詳細信息 關於 Stop 語句的信息,請參閱第十三章“調試代碼和處理錯誤”中的“使用中斷模式”,以及《語言參考》的“Stop 語句”。關於窗體集合或者釋放對象引用的信息,請參閱第九章“用對象編程”。
在應用程序中使用菜單
許多簡單的應用程序只由一個窗體和幾個控件組成,但是通過增加菜單可以增強 Visual Basic 應用程序的功能。這一節將介紹如何在應用程序中創建菜單和使用菜單。
用菜單編輯器創建菜單
用菜單編輯器可以創建新的菜單和菜單欄、在已有的菜單上增加新命令、用自己的命令來替換已有的菜單命令以及修改和刪除已有的菜單和菜單欄。
要顯示菜單編輯器,請:
從“工具”菜單上,選取“菜單編輯器”。
- 或者 -
在“工具欄”上單擊“菜單編輯器”按鈕。這就會打開菜單編輯器,如圖 6.7 所示。
盡管大多數菜單控件屬性可用菜單編輯器設置,所有的菜單屬性在“屬性”窗口中也都是可用的。菜單控件的兩個最重要的屬性是:
Name——這是代碼中用來引用菜單控件的名字。
Caption——這是出現在控件上的文本。
菜單編輯器中的其它屬性,包括 Index、Checked 和 NegotiatePosition,在本章稍後介紹。
使用菜單編輯器中的列表框
菜單控件列表框(位於菜單編輯器的下部)列出當前窗體的所有菜單控件。當在標題文本框中鍵入一個菜單項時,該項也會出現在菜單控件列表框中。從列表框中選取一個已存在的菜單控件可以編輯該控件的屬性。
例如,圖 6.7 表明典型應用程序中“文件”菜單的各種菜單控件。菜單控件在菜單控件列表框中的位置決定了該控件是菜單標題、菜單項、子菜單標題還是子菜單項:
位於列表框中左側平齊的菜單控件作為菜單標題顯示在菜單欄中。
列表框中被縮進過的菜單控件,當單擊其前導的菜單標題時才會在該菜單上顯示。
一個縮進過的菜單控件,如果後面還緊跟著再次縮進的一些菜單控件,它就成為一個子菜單的標題。在子菜單標題以下縮進的各個菜單控件,就成為該子菜單的菜單項。
一個以連字符 (-) 作為它的 Caption 屬性的菜單控件,作為一個分隔符條出現。分隔符條可把菜單項劃分成若干個邏輯組。 注意 如果菜單控件是一個菜單標題、帶有子菜單項、被復選或無效、或者有一個快捷鍵,那麼它就不能作為分隔符條。
要在菜單編輯器中創建菜單控件,請按照以下步驟執行:
1. 選取該窗體
2. 從“工具”菜單中,選取“菜單編輯器”。- 或者 -在“工具欄”上單擊“菜單編輯器”按鈕。
3. 在“標題”文本框中,為第一個菜單標題鍵入希望在菜單欄上顯示的文本。如果希望某一字符成為該菜單項的訪問鍵,也可以在該字符前面加上一個 (&) 字符。在菜單中,這一字符會自動加上一條下劃線。
菜單標題文本顯示在菜單控件列表框中。
4. 在“名稱”文本框中,鍵入將用來在代碼中引用該菜單控件的名字。請參閱本章後面“菜單標題與命名准則”。
5. 單擊向左或向右箭頭按鈕,可以改變該控件的縮進級。
6. 如果需要的話,還可以設置控件的其他屬性。這一工作可以在菜單編輯器中做,也可以以後在“屬性”窗口中做。
7. 選取“下一個”就可以再建一個菜單控件。- 或者 -單擊“插入”可以在現有的控件之間增加一個菜單控件。也可以單擊向上與向下的箭頭按鈕,在現有菜單控件之中移動控件。
8. 如果窗體所有的菜單控件都已創建,選取“確定”可關閉菜單編輯器。創建的菜單標題將顯示在窗體上。在設計時,單擊一個菜單標題可下拉其相應的菜單項。
分隔菜單項
分隔符條作為菜單項間的一個水平行顯示在菜單上。在菜單項很多的菜單上,可以使用分隔符條將各項劃分成一些邏輯組。例如Visual Basic的“幫助”菜單,使用分隔符條將其菜單項分成三組,如圖 6.8 所示。
要在菜單編輯器中創建分隔符條,請按照以下步驟執行:
1. 如果想在一現有菜單中增加一個分隔符條,選取“插入”,在想要分隔開來的菜單項之間插入一個菜單控件。
2. 如有必要,單擊右箭頭按鈕使新菜單項縮進到與它要隔開的菜單項同級。
3. 在“標題”文本框中鍵入一個連字符 (-)。
4. 設置“名稱”屬性。
5. 選取“確定”,關閉菜單編輯器。
注意 雖然分隔符條是當作菜單控件來創建的,它們卻不能響應 Click 事件,而且也不能被選取。
賦值訪問鍵和快捷鍵
通過定義訪問鍵和快捷鍵可改進鍵盤對菜單命令的訪問。
訪問鍵
訪問鍵允許按下ALT鍵並打入一個指定字符來打開一個菜單。一旦菜單打開,通過按下所賦值的字符(訪問鍵)可選取控件。例如,按下 ALT + E 鍵可打開“編輯”菜單,再按P鍵可選取“粘貼”菜單項。在菜單控件的標題中,一個指定的訪問鍵表現為一個帶下劃線的字母,如圖 6.9 所示。
要在菜單編輯器中給菜單控件賦值訪問鍵,請按照以下步驟執行:
1. 選取要賦值訪問鍵的菜單項。
2. 在其“標題”框中,在要作為訪問鍵字符的前面直接鍵入一個 (&) 字符。
例如,如果圖6.9所示的“編輯”菜單被打開,下列Caption屬性設置值響應的對應鍵。
注意 菜單中不能使用重復的訪問鍵。如果多個菜單項使用同一個訪問鍵,則該鍵將不起作用。例如,如果C同時是“剪切”和“復制”的訪問鍵,那麼,當選取“編輯”菜單且鍵入C時,則“復制”命令將被選,但只有按下ENTER鍵以後,應用程序才會執行該命令。而“剪切”命令根本不會執行。
快捷鍵
快捷鍵按下時會立刻運行一個菜單項。可以為頻繁使用的菜單項指定一個快捷鍵,它提供一種鍵盤單步的訪問方法,而不是按住ALT鍵、再按菜單標題訪問字符,然後再按菜單項訪問字符的三步方法。快捷鍵的賦值包括功能鍵與控制鍵的組合,如CTRL + F1鍵或CTRL + A鍵。它們出現在菜單中相應菜單項的右邊,如圖6.10所示。
要對菜單項賦值快捷鍵,請按照以下步驟執行:
1. 打開“菜單編輯器”。
2. 選取該菜單項。
3. 在“快捷鍵”組合框中選取功能鍵或者鍵的組合。
要刪除快捷鍵賦值,應選取列表頂部的“(none)”。
注意 快捷鍵將自動出現在菜單上;因此,不需要在菜單編輯器的“標題”框中鍵入 CTRL+key。
菜單標題與命名准則
為了與其它應用程序保持一致,創建菜單時遵循所確立的命名准則是一個好辦法。
設置 Caption 屬性
為菜單項進行標題賦值時,應當盡量遵循下列准則:
1.菜單中項目名稱應當唯一,但不同菜單中相似動作項目可以重名。
2.項目名稱可以是單詞、復合詞或者多個詞。
3.每一個項目名稱都應當有一個用鍵盤選取命令的、一個唯一的記憶訪問字符。訪問字符應當是菜單標題的第一個字母,除非別的字符更易記;兩個菜單標題不能用同一個訪問字符。關於指定訪問鍵與快捷鍵的詳細信息,請參閱本章前面的“用菜單編輯器創建菜單”部分。
4.如果命令在完成之前還需要附加信息,則在其名稱後面應當有一個省略號(…),比如顯示一個對話框的命令(“另存為…”,“首選項…”) 。
5.項目名稱盡量簡短。如果要使應用程序本地化,那麼,在外文版中字詞長度會增加將近百分之三十,這樣也許沒有足夠空間列出各個菜單項。有關應用程序本地化的更詳細內容,請參閱第十六章“國際發行”。
菜單命名約定
為了使代碼更可讀和更易維護,在菜單編輯器中設置 Name 屬性時遵循已確定的命名約定是一個好辦法。大多數命名約定規則都建議用前綴來標識對象(即,對菜單控件用 mnu),其後緊跟頂層菜單的名稱(如 File)。對於子菜單,其後再緊跟該子菜單的標題(如 mnuFileOpen)。
詳細信息 有關所建議的命名約定的示例,請參閱附錄 B“Visual Basic 編碼約定”。有關所建議的命名約定的示例,請參閱“Visual Basic 編碼約定”。