none
VS2010 MFC 如何动态添加菜单 RRS feed

  • 问题

  •  我 在网上 找过 一个  用 onShowPopupMenu() 消息

     

    现在 resourch.h 里面加  #define

     

    然后 在函数中 创建 

     

    BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
    {
        // TODO: Add your specialized code here and/or call the base class

        int iIndex = -1;
        if (!CMFCToolBar::IsCustomizeMode()&&(iIndex=pMenuPopup->GetMenuBar()->CommandToIndex(ID_EDIT_PASTE))>=0)
        {
            pMenuPopup->InsertSeparator(iIndex+1);
            pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1,NULL,-1,_T("&MyItem 1")),iIndex+2);
        }   //使用CommandToIndex()来获得菜单项的索引,然后根据索引来确定子菜单项的添加位置
        return CFrameWndEx::OnShowPopupMenu(pMenuPopup);
    }//效果是在“Edit”菜单最下面添加了一个分割线和一个"MyItem 1"子项

    效果如图,因为还没有为其添加处理函数,所以呈灰色:

     

     

    但是 我运行了 会出现运行时错误  就是说访问了不可读的内存  求解

    2011年3月23日 12:11

答案

  • try this code:

    BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
    {
     if(pMenuPopup)
     {
      int iIndex = -1;
      CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar();
      if (!CMFCToolBar::IsCustomizeMode()&& (NULL != pMenuBar) && (iIndex=pMenuBar->CommandToIndex(ID_EDIT_PASTE))>=0)
      {
       pMenuPopup->InsertSeparator(iIndex+1);
       pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1,NULL,-1,_T("&MyItem 1")),iIndex+2);
       pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1 + 1,NULL,-1,_T("&MyItem 2")),iIndex+3);
      }
     }
     return TRUE;
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年3月24日 3:47
    版主
  • try this:

    CMenu menu;
     menu.CreateMenu();
     ASSERT(menu.GetSafeHmenu());
     menu.AppendMenu(MF_STRING, ID_MYITEM+1, _T("MenuItem 1"));
     menu.AppendMenu(MF_STRING, ID_MYITEM+2, _T("MenuItem 2"));
     CMFCToolBarMenuButton NewMenu(ID_MYITEM, menu.GetSafeHmenu(), -1, _T("New_Menu"));
     menu.Detach();
     int nIndex = -1;
     VERIFY(-1 != (nIndex = m_wndMenuBar.InsertButton(NewMenu, m_wndMenuBar.GetCount()))); 
     RecalcLayout();


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年3月25日 6:10
    版主
  • 每次运行一次会多出来一个,是因为这些东西会保存在注册表项中,下次程序启动以后就会从该注册表项中读取,然后还原之前各个菜单项的内容。所以在你的程序中再次运行上述的代码,就会再添加一个菜单项。所以你没运行一次就会多出一个菜单。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年3月28日 0:59
    版主

全部回复

  • try this code:

    BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
    {
     if(pMenuPopup)
     {
      int iIndex = -1;
      CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar();
      if (!CMFCToolBar::IsCustomizeMode()&& (NULL != pMenuBar) && (iIndex=pMenuBar->CommandToIndex(ID_EDIT_PASTE))>=0)
      {
       pMenuPopup->InsertSeparator(iIndex+1);
       pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1,NULL,-1,_T("&MyItem 1")),iIndex+2);
       pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1 + 1,NULL,-1,_T("&MyItem 2")),iIndex+3);
      }
     }
     return TRUE;
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年3月24日 3:47
    版主
  • 上面的代码 可以实践 添加动态的 菜单

     

    但是我想在 文件 和编辑 或者关于 这些建立对等的 菜单 怎么办??????????????

    2011年3月24日 13:10
  • try this:

    CMenu menu;
     menu.CreateMenu();
     ASSERT(menu.GetSafeHmenu());
     menu.AppendMenu(MF_STRING, ID_MYITEM+1, _T("MenuItem 1"));
     menu.AppendMenu(MF_STRING, ID_MYITEM+2, _T("MenuItem 2"));
     CMFCToolBarMenuButton NewMenu(ID_MYITEM, menu.GetSafeHmenu(), -1, _T("New_Menu"));
     menu.Detach();
     int nIndex = -1;
     VERIFY(-1 != (nIndex = m_wndMenuBar.InsertButton(NewMenu, m_wndMenuBar.GetCount()))); 
     RecalcLayout();


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年3月25日 6:10
    版主
  • 我把 上面的代码放进了 oncreate 里面 菜单 出现一秒 然后消失了 貌似被覆盖了

     

    我把上面的代码放在 loadframe 里面  神奇的事情出现了 我在6.0里没有遇到 loadframe 这个函数 不知道这个功能

    我把代码放里面以后  每调试一次 就会多出一个菜单 我调试了六次 出现了 六个  求帮助  谢谢

     

    我最后将    menu.AppendMenu(MF_STRING|MF_POPUP, IDM_SETTING1+1, _T("MenuItem 1")); 貌似没有作用

     


    2011年3月25日 10:28
  • 每次运行一次会多出来一个,是因为这些东西会保存在注册表项中,下次程序启动以后就会从该注册表项中读取,然后还原之前各个菜单项的内容。所以在你的程序中再次运行上述的代码,就会再添加一个菜单项。所以你没运行一次就会多出一个菜单。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年3月28日 0:59
    版主
  • 那请问

     

    CMenu menu;
     menu.CreateMenu();
     ASSERT(menu.GetSafeHmenu());
     menu.AppendMenu(MF_STRING, ID_MYITEM+1, _T("MenuItem 1"));
     menu.AppendMenu(MF_STRING, ID_MYITEM+2, _T("MenuItem 2"));
     CMFCToolBarMenuButton NewMenu(ID_MYITEM, menu.GetSafeHmenu(), -1, _T("New_Menu"));
     menu.Detach();
     int nIndex = -1;
     VERIFY(-1 != (nIndex = m_wndMenuBar.InsertButton(NewMenu, m_wndMenuBar.GetCount()))); 
     RecalcLayout();

    (这段代码是您提供的 但是不知道放哪里?,放在oncreate里面 会被覆盖 一下就没了)

     

    这段代码应该放在哪个函数里面???能不能给我介绍些 loadframe的作用 谢谢?????

     

    谢谢

     

    2011年3月30日 8:47
  • 要怎么改呢?
    2013年1月25日 2:37