第8章 菜單的建立
主要內容
建立和使用菜單
菜單的種類:
1:下拉菜單;
2:快捷菜單,又稱彈出菜單或右鍵菜單;
3:系統菜單,又稱控制菜單。
菜單和菜單項
菜單和菜單項的關係類似於文件夾和文件。真正實現具體功能的是菜單項,如:“新建”、“打開”、“保存”等;而菜單的作用則是容納一組相關的菜單項,如“文件”菜單,“編輯”菜單。
菜單資源的建立
1:創建”Resource Script“文件;
2:在”ResourceView“中插入新菜單;
3:修改菜單ID(可選);
4:創建菜單資源中的菜單項:
菜單只需要設置”Caption“選項,並需要選中”Pop-up“ 選項;
菜單項需要設置”ID“和”Caption“兩項。要注意的是,如果菜單項想使用系統提供的ID,如退出程序”ID_APP_EXIT“,必須要在下拉列表裏面選,不可以自己輸,否則會資源ID重複定義的錯誤。
普通菜單的操作
一:菜單的載入
方法1:利用CFrameWnd::Create()方法。
Create方法聲明(詳見第2章)
BOOL virtual CFrameWnd::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT &rect = rectDefault, CWnd *pParentWnd = NULL, LPCTSRT lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext *pContext = NULL)
其中的參數lpszMenuName就是一個定義在資源文件(RC文件)中的菜單名稱。注意:如果要以菜單的資源ID代表菜單,要使用如下方式:MAKEINTRESOURCE(菜單資源ID)。
方法2:利用CMenu對象以及CMenu::LoadMenu()方法。
操作步驟:
1:聲明CMenu對象。
2:利用CMenu.LoadMenu(菜單資源ID )載入菜單。
3:利用CFrameWnd::SetMenu(CMenu*)方法爲視窗框架對象綁定菜單。
如:
class MyFrame : public CFrameWnd { private: CMenu *pMenu; public: MyFrame() { Create(NULL, "My Frame"); pMenu = new CMenu; pMenu->LoadMenu(IDR_MENU1); SetMenu(pMenu); } };
方法3:利用CMenu::Attach()方法。
聲明:BOOL CMenu::Attach(HMENU hMenu)
參數爲指向菜單的指針。
二:菜單資源與CMenu對象的分離
當刪除CMenu對象時,需要先將其綁定的菜單資源與其分離。
方法:HMENU CMenu::Detach()
三:獲取子菜單
CMenu* CMenu::GetSubMenu(int nPos)
參數nPos爲子菜單的序號,第一個子菜單爲0。
四:獲取指定位置的菜單項的識別符
UINT CMenu::GetMenuItemID(int nPos)
五:在菜單中插入新的子菜單或菜單項
在指定位置插入:
BOOL CMenu::InsertMenu(
UINT nPosition,
UINT nFlags,
UINT nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL)
參數說明:
1:nPosition
在nPosition指定的位置前插入新菜單。
nPosition可以是菜單項的序號,也可以是資源ID,方式由第二個參數nFlags指定。
2:nFlags
作用一:指定nPosition是菜單序號還是資源ID;
作用二:控制插入菜單(項)的屬性和狀態。
旗標說明
控制nPosition的旗標 | |
MF_BYPOSITION | nPosition的值應爲菜單項的序號 |
MF_BYCOMMAND | nPosition的值因爲菜單項的資源ID |
MF_DISABLED | 菜單項不可用 |
MF_ENABLED | 菜單項有效 |
MF_GRAYED | 菜單項爲灰色 |
MF_STRING | |
MF_OWNERDRAW | |
MF_SEPARATOR | 分割線 |
MF_POPUP | 彈出式子菜單 |
MF_MENUBARBREAK | |
MF_MENUBREAK |
MF_CHECKED | 菜單項被選中 |
MF_UNCHECKED | 菜單項未被選中 |
3:nIDNewItem
新菜單的ID。
4:lpszNewItem
新菜單的Caption。在nFlags中指定旗標MF_STRING。
在菜單的尾部追加新菜單
BOOL CMenu::AppendMenu(
UINT nFlags,
UINT nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL)
參數定義同InsertMenu方法。
六:設置菜單項是否被勾選
UINT CMenu::CheckMenuItem(UINT nIDCheckItem, UINT nCheck)
參數說明:
1:nIDCheckItem:指定相應的菜單項,可以是序號或ID,由參數nCheck控制。
2:nCheck:由兩組旗標構成,第一組旗標爲MF_BYCOMMAND或MF_BYPOSITION,用於指定第一個參數是菜單項的序號還是ID;第二組旗標爲MF_CHECK或MF_UNCHECK,用於指定菜單項是否被選中。兩組旗標用“|”符號連接。
注:設置菜單項是否被勾選的較常用的方法是OnUpdate方法。
七:修改菜單項
修改菜單項其實是用新的菜單項替換掉指定的菜單項。
BOOL CMenu::ModifyMenu(
UINT nPosition,
UINT nFlags,
UINT nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL)
說明:用資源ID爲nIDNewItem、Caption爲lpszNewItem的菜單項替換掉菜單項nPosition。nFlags參數同InsertMenu。
八:刪除菜單項
BOOL CMenu::DeleteMenu(UINT nPosition, UINT nFlags)
說明:刪除nPosition指定的菜單項;nFlags的值爲MF_BYCOMMAND或MF_BYPOSITION。
系統菜單的操作
一:獲取系統菜單
CMenu *CWnd::GetSystemMenu(BOOL bRevert) const
說明:如果bRevert爲FALSE,則返回當前窗口的系統菜單;如果爲TRUE,返回值不確定。
二:其他操作菜單的方法同普通菜單。
彈出式菜單的操作
當按下鼠標右鍵時,會產生ON_WM_CONTEXTMENU消息,該消息會調用CWnd::OnContextMenu方法,在該方法中,利用CMenu::TrackPopupMenu建立彈出式菜單。
未完待續。。。