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) //获取高

posted on 2010-08-04 00:41  icove  阅读(940)  评论(0编辑  收藏  举报