程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB6 >> vb菜單在應用程序中的使用(二)

vb菜單在應用程序中的使用(二)

編輯:VB6

創建子菜單
所創建的每個菜單可以包含最多五級子菜單。子菜單會分支出另一個菜單以顯示它自己的菜單項。需使用子菜單的場合有:
菜單欄已滿。
某一特定菜單控件很少被用到。
要突出某一菜單控件與另一個的關系。
然而,如果菜單欄中還有空間,最好再創建一個菜單標題而不是子菜單。這樣,當菜單拉下時所有控件都可見。限制使用子菜單也是一種好的編程策略,它可以免去查找應用程序菜單界面的負擔(大多數應用程序都只使用一級子菜單)。
在菜單編輯器中,在不是菜單標題的菜單控件之下縮進的任何菜單控件,都是子菜單控件。一般來說,子菜單控件可以包括子菜單項、分隔符條和子菜單標題。
要創建子菜單,請按照以下步驟執行:
1. 創建想作為子菜單標題的菜單項。
2. 創建將出現在新子菜單中的各個項目,然後單擊右箭頭按鈕將它們縮進。
在菜單編輯器中每一縮進級前都加了四個點 (....)。要刪除一縮進級,單擊左箭頭按鈕。
注意 如果想用多於一級的子菜單,可以考慮使用對話框來替代。對話框允許在一個地方指定好幾個選擇。關於使用對話框的內容,請參閱本章後面的“對話框”。

創建菜單控件數組
菜單控件數組就是在同一菜單上共享相同名稱和事件過程的菜單項目的集合。菜單控件數組使用於:
在運行時要創建一個新菜單項,它必須是控件數組中的成員。如 MDINotepad 示例,它就用一個菜單控件數組來存儲新近打開的文件清單。
簡化代碼,因為通用代碼塊可以被所有菜單項使用。
每個菜單控件數組元素都由唯一的索引值來標識,該值在菜單編輯器上“Index 屬性框”中指定。當一個控件數組成員識別一個事件時,Visual Basic將其 Index 屬性值作為一個附加的參數傳遞給事件過程。事件過程必須包含有核對 Index 屬性值的代碼,因而可以判斷出正在使用的是哪一個控件。
詳細信息 關於控件數組的詳細信息,請參閱第七章“使用 Visual Basic 的標准控件”中的“使用控件數組”。要在菜單編輯器中創建菜單控件數組,請按照以下步驟執行:
1. 選取窗體。
2. 從“工具”菜單中,選取“菜單編輯器”。
- 或 -
在“工具欄”上單擊“菜單編輯器”按鈕。
3. 在“標題”文本框中,鍵入想出現在菜單欄中的第一個菜單標題的文本。菜單標題文本顯示在菜單控件列表框中。
4. 在“名稱”文本框中,鍵入將在代碼中用來引用菜單控件的名稱。保持“索引”框是空的。
5. 在下一個縮進級,通過設定“標題”和“名稱”來創建將成為數組中第一個元素的菜單項。
6. 將數組中第一個元素的“索引”設置為 0。
7. 在第一個的同一縮進級上創建第二個菜單項。
8. 將第二個元素的“名稱”設置成與第一個元素相同,且把它的“索引”設置為 1。
9. 對於數組中的後續元素重復步驟 5- 8。
重點 菜單控件數組的各元素在菜單控件列表框中必須是連續的,而且必須在同一縮進級上。創建菜單控件數組時,要把在菜單中出現的分隔符條也包括進去。

運行時創建和修改菜單
設計時創建的菜單也能動態地響應運行時的條件。例如,如果菜單項的動作在某些點上成為不適當時,通過使其失效可防止對該菜單項的選取。比如:在 MDI NotePad 應用程序中,如果剪貼板上沒有任何文本,則“編輯”菜單中的“粘貼”菜單項變暗,因而就不能被選。
如果有一個菜單控件數組,也可以動態地增加菜單項。這將在本主題後面的“運行時添加菜單控件”中講述。
也可以編寫應用程序,使用復選標志來指示幾個命令中的哪一個是最後選取的。例如:如果工具欄被顯示,MDI NotePad 應用程序工具欄的“選項”菜單項就會顯示一個復選標志。本節描述的其它菜單控件功能包括使菜單項可見或不可見以及增加或刪除菜單項操作的代碼。

使菜單命令有效或無效
所有的菜單控件都具有 Enabled 屬性,當這個屬性設為 False 時,菜單命令無效使它不響應動作。當 Enabled 設為 False 時,快捷鍵的訪問也無效。一個無效的菜單控件會變暗,如圖 6.11 所示的“粘貼”菜單項。

例如:下列語句使 MDI NotePad 應用程序中“編輯”菜單上的“粘貼”菜單項無效。
mnuEditPaste.Enabled = False
菜單標題的無效使得整個菜單無效,因為不首先單擊菜單標題,就不能訪問任何菜單項。例如:下列代碼將使 MDI NotePad 應用程序的“編輯”菜單無效。
mnuEdit.Enabled = False

顯示菜單控件上的復選標志
使用 Checked 屬性,可以把一個復選標志放置在菜單上,以便:
表示打開/關閉條件的狀態。選取菜單命令可交替地增加和刪除此復選標志。
指示幾個模式中哪一個正在起作用。MDI NotePad 應用程序的“選項”菜單使用復選標志來指示工具欄的狀態,如圖 6.12 所示。
在 Visual Basic 中可以用 Checked 屬性來創建復選標志。通過選取被標記為 Checked 的復選框來設置菜單編輯器中的 Checked 屬性的初始值。在運行時要從一個菜單控件上增加或刪除復選標志,可以從代碼中設置它的Checked 屬性。例如:
Private Sub mnuOptions_Click ()
'根據 Visible 屬性設置復選標志的狀態。
mnuOptionsToolbar.Checked = picToolbar.Visible
End Sub

使菜單控件不可見
在菜單編輯器中,通過選取被標記為 Visible 的復選框,可以設置菜單控件的 Visible 屬性的初值。在運行時,要使一個菜單控件可見或不可見,可以從代碼中設置其 Visible 屬性。例如:
mnuFileArray(0).Visible = True ' 使控件可見。
mnuFileArray(0).Visible = False ' 使控件不可見。
當一個菜單控件不可見時,菜單中的其余控件會上移以填補空出的空間。如果控件位於菜單欄上,則菜單欄上其余的控件會左移以填補該空間。
注意 使菜單控件不可見也產生使之無效的作用,因為該控件通過菜單、訪問鍵或者快捷鍵都再無法訪問。如果菜單標題不可見,則該菜單上所有控件均無效。

運行時添加菜單控件
運行時菜單可以增長。例如:在圖 6.13 中 作為 SDI NotePad 應用程序中被打開的文件,會動態地創建菜單項來顯示剛打開文件的路徑名。

運行時為了創建控件必須使用控件數組。因為設計時對mnuRecentFile菜單控件的 Index 屬性進行了賦值,它自動地成為控件數組的一個元素——即使還沒有創建其它元素。
當創建 mnuRecentFile(0) 時,實際上創建了一個在運行時不可見的分隔符條。當運行時用戶第一次存儲一個文件時,這個分隔符條就會變得可見,且第一個文件名被加到該菜單上。運行時每存儲一個文件,則會再裝入一個菜單控件到該數組中,從而使該菜單增長。
運行時所創建的控件可以使用 Hide 方法或者設置該控件的 Visible 屬性為False 來隱藏。如果要從內存中刪除一個控件數組中的控件,請使用 Unload語句。

編寫菜單控件的代碼
當用戶選取一個菜單控件時,一個 Click 事件出現。需要在代碼中為每個菜單控件編寫一個 Click 事件過程。除分隔符條以外的所有菜單控件(以及無效的或不可見的菜單控件)都能識別 Click 事件。
在菜單事件過程中編寫的代碼與在控件任何其它事件過程中編寫的代碼完全相同。例如:“文件”菜單中的“關閉”菜單項的 Click 事件的代碼看上去如下:
Sub mnuFileClose_Click()
Unload Me
End Sub
一旦菜單標題被選取,Visual Basic 將自動地顯示出一個菜單;但是,沒有必要為一個菜單標題的 Click 事件過程編寫代碼,除非想執行其它操作,比如每次顯示菜單時使某些菜單項無效。
注意 在設計時,當關閉菜單編輯器時,所創建的菜單將顯示在窗體上。在窗體上選取一個菜單項將顯示那個菜單控件的 Click 事件過程。

顯示彈出式菜單
彈出式菜單是獨立於菜單欄而顯示在窗體上的浮動菜單。在彈出式菜單上顯示的項目取決於按下鼠標右鍵時指針所處的位置;因而,彈出式菜單也被稱為上下文菜單。
在 Microsoft Windows 95 中,可以通過單擊鼠標右鍵來激活上下文菜單。在運行時,至少含有一個菜單項的任何菜單都可以作為彈出式菜單被顯示。為了顯示彈出式菜單,可使用 PopupMenu 方法。這個方法使用下列語法:
[object.]PopupMenu menuname [, flags [,x [, y [, boldcommand ]]]]
例如:當用戶用鼠標右鍵單擊一個窗體時,以下的代碼顯示一個名為 mnuFile的菜單。可用 MouseUp 或者 MouseDown 事件來檢測何時單擊了鼠標右鍵,雖然標准用法是使用 MouseUp 事件:
Private Sub Form_MouseUp (Button As Integer, Shift As _
Integer, X As Single, Y As Single)
If Button = 2 Then ' 檢查是否單擊了鼠標右鍵。
PopupMenu mnuFile ' 把文件菜單顯示為一個彈出式菜單。
End If
End Sub
直到菜單中被選取一項或者取消這個菜單時,調用 PopupMenu 方法後面的代碼才會運行。
注意 每次只能顯示一個彈出式菜單。在已顯示一個彈出式菜單的情況下,對後面的調用 PopupMenu 方法將不予理睬。在一個菜單控件正活動的任何時刻,調用 PopupMenu 方法均不會被理睬。
常常會想用一個彈出式菜單來訪問那些在菜單欄中不常用的選項。為創建一個不顯示在菜單欄裡的菜單,可在設計時使頂級菜單項目為不可見(保證在菜單編輯器裡的“Visible”復選框沒有被選上)。當 Visual Basic 顯示一個彈出式菜單時,指定的頂級菜單的 Visible 屬性會被忽略。

Flags 參數
在PopupMenu 方法中使用 flags 參數可以進一步定義彈出式菜單的位置與性能。下表列出了可用於描述彈出式菜單位置的標志。

想要指定一個標志,從每組中選取一個常數,再用 Or 操作符將它們連起來。下面的代碼是,當用戶單擊一個命令按鈕時,顯示一個上邊框在窗體中心的彈出式菜單。彈出式菜單觸發受到鼠標右鍵或左鍵單擊的菜單項的Click 事件。
Private Sub Command1_Click ()
' X 變量和 Y 變量的尺寸。
Dim xloc, yloc
'設置 X 變量和 Y 變量到窗體中心。
xloc = ScaleWidth / 2
yloc = ScaleHeight / 2

'顯示彈出式菜單。
PopupMenu mnuEdit, vbPopupMenuCenterAlign Or _
vbPopupMenuRightButton, xloc, yloc
End Sub

Boldcommand 參數
使用 boldcommand 參數來指定在顯示的彈出式菜單中想以粗體字體出現的菜單控件的名稱。在彈出式菜單中只能有一個菜單控件被加粗。

MDI 應用程序中的菜單
在 MDI 應用程序中,每一個子窗體的菜單都顯示在 MDI 窗s體上,而不是在子窗體本身。當子窗體有焦點時,該子窗體的菜單(如果有的話)就代替菜單欄上的 MDI 窗體的菜單。如果沒有可見的子窗體,或者如果帶有焦點的子窗體沒有菜單,則顯示 MDI 窗體的菜單(見圖 6.14 和 6.15)。MDI 應用程序使用幾套菜單的情況很普遍。當打開一個文檔時,應用程序顯示與該類文檔相關的菜單。通常,當沒有可見子窗體時,會顯示一個不同的菜單。例如,當沒有文件打開時,Microsoft Excel 只顯示“文件”與“幫助”菜單。當用戶打開一個文件時,其他菜單就會顯示出來(“文件”、“編輯”、“視圖”、“插入”、“格式”、“工具”、“數據”和“窗口”等等)。

創建 MDI 應用程序的菜單
通過給 MDI 窗體和子窗體添加菜單控件,可以為 Visual Basic 應用程序創建菜單。管理 MDI 應用程序中菜單的一個方法是把希望在任何時候都顯示的菜單控件放在 MDI 窗體上(即使沒有子窗體可見時)。當運行該應用程序時,如果沒有可見的子窗體,會自動顯示 MDI 窗體菜單,如圖 6.14所示。
把應用於子窗體的菜單控件放置到子窗體中。在運行時,只要有一個子窗體可見,這些菜單標題就會顯示在 MDI 窗體的菜單欄中。
有些應用程序支持多種類型的文檔。例如,在 Microsoft Access 中,可以打開表格、查詢、窗體和其它文檔類型。要在 Visual Basic 中創建這樣的應用程序,應使用兩個子窗體。設計一個帶有執行工作單任務菜單的子窗體和另一個帶有完成圖表任務菜單的子窗體。

在運行時,當工作單窗體的實例有焦點時,則顯示工作單菜單,而當選取圖表時,則顯示圖表窗體的菜單。如果所有的工作單和圖表都關閉,則顯示 MDI 窗體的菜單。關於創建菜單的詳細內容,請參閱本章前面的“在應用程序中使用菜單”部分。

創建“窗口”菜單
大多數 MDI 應用程序(例如:Microsoft Word for Windows 與 MicrosoftExcel)都結合了“窗口”菜單。這是一個顯示所有打開的子窗體標題的特殊菜單,如圖 6.15 所示。另外,有些應用程序將操縱子窗體的命令,比如“層疊”、“平鋪”與“排列圖標”,放在這個菜單中。
在 MDI 窗體或者 MDI 子窗體上的任何菜單控件,只要將其 WindowList屬性設置為 True,都可以用於顯示打開子窗體的清單。在運行時,VisualBasic 自動管理與顯示標題清單,並在當前正有焦點的標題旁邊顯示一個復選標志。另外,在窗口清單的上方自動放置一個分隔符條。
要設置 WindowList 屬性,請按照以下步驟執行:
1. 選取希望菜單出現其上的窗體,從“工具”菜單中,選取“菜單編輯器”。
注意 WindowList 屬性只應用於 MDI 窗體和 MDI 子窗體。它對標准窗體(非 MDI)不起作用。
2. 在菜單編輯器列表框中,選取希望打開的子窗體的清單顯示在其上的菜單。
3. 選取“WindowList”復選框。
在運行時,這個菜單顯示打開的子窗體的清單。另外,這個菜單控件的WindowList 屬性返回 True。
詳細信息 請參閱《語言參考》的“WindowList 屬性”。

排列子窗體
就像前面所提到的,有些應用程序把諸如平鋪 (Tile)、層疊 (Cascade) 與排列圖標 (Arrange Icons) 等操作列在和打開的子窗體列表的同一個菜單上。在 MDI 窗體中使用 Arrange 方法來重新對齊子窗體。可以層疊、水平平鋪或者沿著 MDI 窗體的下部排列的子窗體圖標等方式來顯示子窗體。下面的實例示出了“層疊”、“平鋪”和“排列圖標”菜單控件的 Click 事件過程。
Private Sub mnuWCascade_Click ()
'層疊子窗體。
frmMDI.Arrange vbCascade
End Sub

Private Sub mnuWTile_Click ()
'平鋪子窗體。
frmMDI.Arrange vbTileHorizontal
End Sub

Private Sub mnuWArrange_Click ()
'排列所有子窗體圖標。
frmMDI.Arrange vbArrangeIcons
End Sub
注意 內部常數 vbCascade、vbTileHorizontal 和 vbArrangeIcons 都在對象浏覽器的 Visual Basic (VB) 對象庫中列出。
當平鋪或者層疊有著固定邊框類型的子窗體時,每個子窗體都像具有可變尺寸邊框那樣被定位。這使得子窗體可能重疊。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved