第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建立弹出式菜单。
未完待续。。。