1、菜单的制作菜单的制作
一般有两种方法一是利用VC++的资源编辑器制作。
新建MFC工程后进入资源视图,然后再资源视图中点击鼠标右键后选择添加资源。接着选中menu后点击添加,这样一个菜单的创建就完成。剩下来的工作就是添加菜单项了。在添加过程中设置菜单项ID以便操作。
另外一个就是直接编写RC文件了。通过文本编辑器打开RC文件,然后进行编辑。示例如下
IDR_MAINFRAME MENU //创建菜单,菜单ID为IDR_MAINFRAME BEGIN POPUP "文件(&F)" //创建弹出菜单 菜单名称为文件,快捷键为ATL+F BEGIN MENUITEM "新建(&N)\tCtrl+N", ID_FILE_NEW //创建菜单项,ID为 ID_FILE_NEW,快捷键为Ctrl+N MENUITEM "打开(&O)...\tCtrl+O", ID_FILE_OPEN MENUITEM "保存(&S)\tCtrl+S", ID_FILE_SAVE MENUITEM "另存为(&A)...", ID_FILE_SAVE_AS MENUITEM SEPARATOR //创建菜单中的分割线 MENUITEM "打印(&P)...\tCtrl+P", ID_FILE_PRINT MENUITEM "打印预览(&V)", ID_FILE_PRINT_PREVIEW MENUITEM "打印设置(&R)...", ID_FILE_PRINT_SETUP MENUITEM SEPARATOR MENUITEM "最近的文件", ID_FILE_MRU_FILE1, GRAYED //创建一个不可用的菜单,菜单中显示为灰色。 MENUITEM SEPARATOR MENUITEM "退出(&X)", ID_APP_EXIT END END
2、菜单命令的路由
在MFC向导创建的4个类,既APP,DOC,VIEW,FRAME。首先有框架类FRAME收到消息并立即把这个消息传递给VIEW视类,如果视类中存在该消息的响应,则响应该消息,消息路由就到此结束了。如果视类中不存在该消息的响应,则把消息递交给DOC文档类,若文档类处理了改消息,则结束消息路由。若未处理,则递交给视类,视类再将消息递交给框架类处理。归纳一下消息路由过程为:MESSAGE->FRAME->VIEW->DOC->VIEW->FRAME(均未处理的情况)。
3、菜单的基本操作
(1)获取菜单指针
通过CMenu *GetMenu() const;函数可以获取到菜单指针。但是该函数在VC++2008 MFC创建的BCGControlBar菜单栏中获取到的值始终为NULL,原因是BCGControlBar的菜单工具栏代替了标准工具栏,所以GetMenu失效。解决办法暂无~。
(2)标记菜单
通过 UINT CheckMenuItem(UINT nIDCheckItem,UNIT nCheck) 进行操作
nIDCheckItem的值可以是菜单项ID,也可以是菜单项的位置。通过nCheck来确定。
nCheck的值可以是以下的值 或 组合
MF_CHECKED:命令旁显示默认复选标志
MF_UNCHECKED:清除命令旁的复选标志
MF_BYPOSITION :菜单位置标志
MF_BYCOMMAND:菜单ID标志
(3)设置默认菜单
SetDefaultItem(UINT uItem,BOOL fByPos = FALSE);
uItem : 当fByPos = FALSE时 为菜单项位置,为TRUE时 为菜单ID;
(4)设置位图标题菜单
BOOL SetMenuItemBitmaps( );//CMenu::SetMenuItemBitmaps 。
(5)使菜单项有效,无效,或变灰
UINT EnableMenuItem();//CMenu::EnableMenuItem(6)在当前窗口上设置新菜单或移除菜单
BOOL SetMenu( CMenu* pMenu );//CWnd::SetMenu在当前窗口上设置新菜单或移除菜单。SetMenu(NULL)移除菜单
(7)分离菜单与CMenu并返回菜单句柄。
HMENU Detach( );(8)
获取菜单的宽和高:
GetSystemMetrics(SM_CXMENUCHECK) //获取宽
GetSystemMetrics(SM_CYMENUCHECK) //获取高