从应用程序主菜单栏中的POPUP菜单的工具栏按钮调用时,OnInitMenuPopup无法正确初始化

时间:2016-10-24 16:47:48

标签: visual-c++ mfc toolbar popupmenu mfc-feature-pack

为了缩短历史记录,想象一下我的主菜单是一个CMFCMenuBar,其菜单定义如下:

self.event_date.day

由于POPUP菜单没有ID(所有值都为-1),要知道我正在进行初始化的菜单,我按照https://stackoverflow.com/a/3910405/383779上的方法执行了

之类的功能
IDR_MAINFRAME MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "New",               ID_FILE_NEW
        MENUITEM "Open",              ID_FILE_OPEN
        MENUITEM "Save",              ID_FILE_SAVE
        POPUP "Save As"
        BEGIN
             MENUITEM "Format XXX",                 ID_FILE_SAVEAS_XXX
             MENUITEM SEPARATOR
             MENUITEM "Format YYY",                 ID_FILE_SAVEAS_YYY
             MENUITEM SEPARATOR
             MENUITEM "Format ZZZ",                 ID_FILE_SAVEAS_ZZZ
             MENUITEM "Format WWW",                 ID_FILE_SAVEAS_WWW
        END
        MENUITEM "Close",             ID_FILE_CLOSE
    END
    POPUP "&Object"
    BEGIN
        POPUP "Create object"
        BEGIN
            MENUITEM "Create object...",            ID_CREATE_OBJECT
            MENUITEM "Create object as...",         ID_CREATE_OBJECTAS
        END
        POPUP "Save object"
        BEGIN
            MENUITEM "Save object...",              ID_SAVE_AS_XXX
            MENUITEM "Save object copy",            ID_SAVE_OBJECT_COPY
        END
    END
    MENUITEM "Delete",                      ID_DELETE_OBJECT
    END
END

菜单初始化如下:

bool CMainFrame::IsFileMenu(CMenu* pPopupMenu) const
{
    if(!pPopupMenu);    
       return false;
    return (pPopupMenu->GetMenuItemCount() > 0) && (pPopupMenu->GetMenuItemID(0) == ID_FILE_NEW);
}

bool CMainFrame::IsObjectMenu(CMenu* pPopupMenu) const
{
    if(!pPopupMenu);    
       return false;
    return (pPopupMenu->GetMenuItemCount() > 0) && (pPopupMenu->GetMenuItemID(2) == ID_DELETE_OBJECT);
}

注意重复void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { if(!license.supports("SaveAsFile")) { if(IsFileMenu()) { //code to find ID_FILE_SAVEAS_XXX parent menu ("Save As"), then recursively delete all its descendants and itself } if(IsObjectMenu()) { for(int i = 0; i < pPopupMenu->GetMenuItemCount();i++) { MENUITEMINFO MenuItemInfo; memset(&MenuItemInfo, 0, sizeof(MENUITEMINFO)); MenuItemInfo.cbSize = sizeof (MENUITEMINFO); // must fill up this field MenuItemInfo.fMask = MIIM_SUBMENU; if (!pPopupMenu->GetMenuItemInfo(i, &MenuItemInfo, TRUE)) continue; CMenu* SubMenu = pPopupMenu->GetSubMenu(i); if (SubMenu != NULL) { memset(&MenuItemInfo, 0, sizeof(MENUITEMINFO)); MenuItemInfo.cbSize = sizeof (MENUITEMINFO); MenuItemInfo.fMask = MIIM_ID | MIIM_TYPE; for(int j=0; j<SubMenu->GetMenuItemCount() ;j++ ) { SubMenu->GetMenuItemInfo(j, &MenuItemInfo, TRUE); if (MenuItemInfo.wID == ID_CREATE_OBJECTAS) { for (int i=0; i<m_custom_objects.GetSize(); i++) pPopup->AppendMenu(MF_STRING | MF_ENABLED, WM_MENU_CUSTOM_OBJECTS_BEGIN + i, (LPCTSTR) m_custom_objects[i].GetName() ); found= true; break; } } if(found) break; } } } } __super::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); } MENUITEM标识符!由于我不想在支持“SaveAsFile”的许可证不存在时删除“保存对象”POPUP,因此绝对需要识别正在处理的菜单。

现在,用户已使用“MFC自定义”对话框创建了工具栏,然后将“创建对象”POPUP拖动到新工具栏。当他单击工具栏的这个新按钮时,他会看到“创建对象”和“将对象创建为”选项,但由于未满足ID_FILE_SAVEAS_XXX条件,因此未附加自定义对象。当他从主菜单中出来时,行为完全不同;附加已经完成!

如何在用户点击工具栏按钮时以自定义对象的追加方式制作代码?

1 个答案:

答案 0 :(得分:0)

我并不为自己的代码感到自豪,但我通过将“对象”的代码与“创建对象”菜单分开来解决它。

bool CMainFrame::IsCreateObjectMenu(CMenu* pPopupMenu) const
{
    if(!pPopupMenu);    
       return false;
    return (pPopupMenu->GetMenuItemCount() > 0) && (pPopupMenu->GetMenuItemID(0) == ID_CREATE_OBJECT);
}


void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{
    if(!license.supports("SaveAsFile"))
    {
         if(IsFileMenu())
         {
              //code to find ID_FILE_SAVEAS_XXX parent menu ("Save As"), then recursively delete all its descendants and itself
         }

         if(IsObjectMenu())
         {
              // Do things
         }

         if(IsCreateObjectMenu())
         {
             for (int i=0; i<m_custom_objects.GetSize(); i++)
                 pPopupMenu->AppendMenu(MF_STRING | MF_ENABLED, WM_MENU_CUSTOM_OBJECTS_BEGIN + i, (LPCTSTR) m_custom_objects[i].GetName());
         }
    }

    __super::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
}