菜單欄
軟體的大多數功能提供功能入口
菜單欄實際是一種樹型結構,為軟體的大多數功能提供功能入口。點擊以後,即可顯示出菜單項。
菜單欄是按照程序功能分組排列的按鈕集合,在標題欄下的水平欄。Microsoft Word2003菜單欄位於標題欄下方,由“文件”和“視圖”等9個菜單命令組成。菜單也可以在VC的資源視圖中直接創建編輯。MFC為菜單的操作提供了CMenu類。
菜單,將系統可以執行的命令以階層的方式顯示出來的一個界面。一般置於畫面的最上方或者最下方,應用程序能使用的所有命令幾乎全部都能放入。重要程度一般是從左到右,越往右重要度越低。命定的層次根據應用程序的不同而不同,一般重視文件的操作、編輯功能,因此放在最左邊,然後往右有各種設置等操作,最右邊往往設有幫助。一般使用滑鼠的第一按鈕進行操作。
即時菜單(又稱功能表、上下文菜單(Context Menu)),與應用程序準備好的層次菜單不同,在菜單欄以外的地方,通過滑鼠的第二按鈕調出的菜單稱為“即時菜單”。根據調出位置的不同,菜單內容即時變化,列出所指示的對象可以進行的操作。
Microsoft Word2003菜單欄位於標題欄下方,由“文件”、“編輯”、“視圖”、“插入”、“格式”、“工具”、“表格”、“窗口”和“幫助”等組成組成。
單擊菜單欄中的菜單命令將會出現一個下拉菜單。Word2003的菜單有自動記錄功能,也就是說Word 2003記錄了用戶的常用操作習慣,只在菜單中顯示最接近上次常用的命令,這為用戶選擇常用命令提供了很大的方便。如果某些命令在一段時間內沒有被使用,就會自動隱藏。在菜單的底部都有一個箭頭按鈕,單擊該按鈕即可顯示全部的菜單命令。
在菜單欄中,某些命令後邊有個箭頭符號,這表示該命令項后還有下一級子菜單。將滑鼠停留一下,就會自動彈齣子菜單。
如果在菜單命令的前面有一個對號,表明該菜單命令被激活。取消該命令前面的對號,則表明該命令沒有被激活。如果用戶看到某些命令的顏色變為淺灰色,表示該菜單命令暫時不能使用。如果菜單命令前面有圖標,表明可以將這些命令添加到工具欄中。如果我們還會看見菜單命令的後面有組合按鍵,如Ctrl+O,這實際上的該命令的快捷鍵,熟記這些快捷鍵有助於我們快速操作。
菜單控制項顯示應用程序的自定義菜單。命令、子菜單或者分隔條都可包括在菜單之中。每一個創建的菜單至多有四級子菜單。菜單控制項是一組通常在功能上相關的命令或控制項的容器。提供特殊的布局行為,並支持用戶啟動的工具欄大小調整和排列。像winform/wpf ToolBar控制項或專業控制項ComponentOne的MenusandToolbars,可創建停靠/浮動的工具欄,多級菜單,全局的快捷鍵、可摺疊/可展開的頁面,MDI應用程序使用的窗口列表等。
菜單在界面設計中是經常使用的一種元素,包括Windows系統中的窗口、智能終端設備的應用界面等都會經常見到菜單的身影。我們在對可視化窗口操作時,菜單確實提供了很大方便。
菜單可以分為下拉式菜單和彈出式菜單。
下拉式菜單一般在窗口標題欄下面顯示。下拉式菜單通常是由主菜單欄、子菜單及子菜單中的菜單項和分隔條所組成的。
彈出式菜單一般可以通過單擊滑鼠右鍵等操作顯示。它的主菜單不可見,只顯示子菜單。
菜單也可以在VC的資源視圖中直接創建編輯。我們先創建一個新的MFC單文檔工程Example34,具體看看菜單的組成結構及各種標記的意義。
打開Resource View資源視圖,展開Example34->Example34.rc->Menu,我們可以看到有一個ID為IDR_MAINFRAME菜單資源,雙擊打開。
包含“File”的一欄是主菜單欄,點擊“File”彈齣子菜單,可以看到子菜單中有多個菜單項和分隔條。菜單項中含有“...”則表示點擊後會彈出對話框。
除了這些,我們還注意到,很多菜單項的標題文本中都有一個字母帶下劃線,帶下劃線的字母為熱鍵,例如,主菜單欄上的“File”中字母“F”帶下劃線,F就是熱鍵,程序運行並顯示窗口時,在鍵盤上點擊Alt+F就等同於直接點菜單項File,彈出File下的子菜單后,點擊“Open”的熱鍵O就可以實現與直接點菜單項Open相同的功能。
那麼熱鍵是如何定義的呢?我們可以看下“File”菜單項的屬性,Caption為“&File”,很明顯,只要在要定義為熱鍵的字母前加&就可以了。
有些菜單項的右側還顯示了一些字元串,例如,“New”的右側顯示有“Ctrl+N”,這些代表的是快捷鍵,也就是“New”菜單項的快捷鍵是Ctrl+N,“Open”菜單項的快捷鍵是Ctrl+O,用這些組合鍵就能實現與相應菜單項一樣的功能。
快捷鍵如何定義?我們再來看看“Open”菜單項的Caption屬性,為“&Open...\tCtrl+O”,這裡的\t表示在顯示前面的文本后跳格再顯示快捷鍵Ctrl+O,但這樣設置其Caption屬性只是能顯示出快捷鍵,要實現快捷鍵的功能還需要在Accelerator資源中設定。資源視圖中展開Example34.rc->Accelerator,雙擊打開下面的IDR_MAINFRAME,可以看到Accelerator中有四列,分別為:ID、Modifier、Key和Type。ID就是菜單項的ID,Modifer和Key就代表了組合鍵。例如,Open菜單項的ID為ID_FILE_OPEN,Modifer為“Ctrl”,Key為“O”。
MFC為菜單的操作提供了CMenu類,下面就常用的幾個成員函數進行簡單的介紹。
BOOL LoadMenu(UINT nIDResource);
載入菜單資源,並將其附加到CMenu對象上。參數nIDResource指定了要載入的菜單資源的ID。如果菜單載入成功則返回TRUE,否則返回FALSE。
BOOL DeleteMenu(UINT nPosition,UINT nFlags);
在菜單中刪除一個菜單項。參數nPosition指定要刪除的菜單項。參數nFlags就用來解釋nPosition的意義,為MF_BYCOMMAND時說明nPosition表示菜單項的ID,為MF_BYPOSITION時說明nPosition表示菜單項的位置,第一個菜單項的位置為0。如果刪除菜單項成功則返回TRUE,否則返回FALSE。
BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect=0);
用來在指定位置顯示一個浮動的彈出式菜單。參數nFlags指定屏幕坐標和滑鼠位置的標誌,可以是以下取值:
TPM_CENTERALIGN:菜單在水平方向上相對於參數x指定的坐標值居中顯示
TPM_LEFTALIGN:菜單的左側與參數x指定的坐標值對齊
TPM_RIGHTALIGN:菜單的右側與參數x指定的坐標值對齊
TPM_BOTTOMALIGN:菜單的底部與參數y指定的坐標值對齊
TPM_TOPALIGN:菜單項的頂部與參數y指定的坐標值對齊
TPM_VCENTERALIGN:菜單在垂直方向上相對於參數y指定的坐標值居中顯示
這裡先介紹這幾個比較常用的,其他可參見MSDN。參數x指定彈出式菜單的水平方向的屏幕坐標,參數y指定菜單頂部垂直方向上的屏幕坐標,參數pWnd指明哪個窗口擁有此彈出式菜單,不能為NULL,參數lpRect忽略。
UINT CheckMenuItem(UINT nIDCheckItem,UINT nCheck);
在彈出菜單中為菜單項增加選中標記或移除選中標記。參數nIDCheckItem指定要選中或取消選中的菜單項。參數nCheck指定菜單項的選中狀態和如何根據nIDCheckItem確定菜單項的位置,可以是MF_CHECKED或MF_UNCHECKED與MF_BYPOSITION或MF_BYCOMMAND的組合,這幾個標誌的含義如下:
MF_BYCOMMAND:為默認值。說明參數nIDCheckItem表示菜單項的ID
MF_BYPOSITION:說明參數nIDCheckItem表示菜單項的位置,第一個菜單項的位置是0
MF_CHECKED:為菜單項添加選中標記
MF_UNCHECKED:為菜單項移除選中標記
該函數返回菜單項之前的狀態:MF_CHECKED或MF_UNCHECKED,如果菜單項不存在則返回0xFFFFFFFF。
UINT EnableMenuItem(UINT nIDEnableItem,UINT nEnable);
激活、禁用菜單項或使其變灰。參數nIDEnableItem指定要激活、禁用或變灰的菜單項。參數nEnable指定操作的類型,可以是MF_DISABLED、MF_ENABLED或MF_GRAYED與MF_BYCOMMAND或MF_BYPOSITION的組合,這些值的含義如下:
MF_BYCOMMAND:同CheckMenuItem
MF_BYPOSITION:同CheckMenuItem
MF_DISABLED:禁用菜單項,使其不能被選擇但不變灰
MF_ENABLED:激活菜單項,使其能夠被選擇並由變灰狀態恢復
MF_GRAYED:禁用菜單項,使其不能被選擇並變灰
該函數返回菜單項之前的狀態:MF_DISABLED、MF_ENABLED或MF_GRAYED
CMenu*GetSubMenu(int nPos)const;
獲取彈出菜單的CMenu對象。參數nPos指定彈出菜單在菜單中的位置,不能使用ID。返回值是CMenu對象的指針,該CMenu對象的m_hMenu成員為由nPos指定的彈出菜單的句柄,如果不存在這樣的CMenu對象則返回NULL,然後創建一個臨時彈出菜單。
利用ASP.NETMenu控制項,可以開發ASP.NET網頁的靜態和動態顯示菜單。您可以在Menu控制項中直接配置其內容,也可通過將該控制項綁定到數據源的方式來指定其內容。
無需編寫任何代碼,便可控制ASP.NET Menu控制項的外觀、方向和內容。除該控制項公開的可視屬性外,該控制項還支持ASP.NET控制項外觀和主題。有關外觀和主題的更多信息,請參見ASP.NET主題和外觀概述。
靜態顯示和動態顯示
Menu控制項具有兩種顯示模式:靜態模式和動態模式。靜態顯示意味著Menu控制項始終是完全展開的。整個結構都是可視的,用戶可以單擊任何部位。在動態顯示的菜單中,只有指定的部分是靜態的,而只有用戶將滑鼠指針放置在父節點上時才會顯示其子菜單項。
使用Menu控制項的StaticDisplayLevels屬性可控制靜態顯示行為。StaticDisplayLevels屬性指示從根菜單算起,靜態顯示的菜單的層數。例如,如果將StaticDisplayLevels設置為3,菜單將以靜態顯示的方式展開其前三層。靜態顯示的最小層數為1,如果將該值設置為0或負數,該控制項將會引發異常。
MaximumDynamicDisplayLevels屬性指定在靜態顯示層后應顯示的動態顯示菜單節點層數。例如,如果菜單有3個靜態層和2個動態層,則菜單的前三層靜態顯示,后兩層動態顯示。
如果將MaximumDynamicDisplayLevels設置為0,則不會動態顯示任何菜單節點。如果將 MaximumDynamicDisplayLevels設置為負數,則會引發異常。