代码之家  ›  专栏  ›  技术社区  ›  Andrew Truckle

在CMFCMenuButton中正确删除所有子菜单项时出现问题

  •  0
  • Andrew Truckle  · 技术社区  · 1 年前

    我弄糊涂了。

    我有菜单:

    IDR_MENU_POPUP_MANAGE_GROUPS MENU
    BEGIN
        POPUP "__MANAGE_GROUP__"
        BEGIN
            MENUITEM "Add Group",                   ID_POPUP_ADD_GROUP
            POPUP "Edit Group"
            BEGIN
                MENUITEM "__EDIT__",                    ID_POPUP_EDIT_GROUP_BASE
            END
            POPUP "Delete Group"
            BEGIN
                MENUITEM "__DELETE__",                  ID_POPUP_DELETE_GROUP_BASE
            END
        END
    END
    

    此由使用 CMFCMenuButton 。在运行时,我动态删除两个子菜单,如下所示:

    CMenu* pMenu = m_menuManageGroups.GetSubMenu(0);
    CMenu* pSubMenu = nullptr;
    
    pSubMenu = pMenu->GetSubMenu(1);
    pMenu->RemoveMenu(ID_POPUP_EDIT_GROUP_BASE, MF_BYCOMMAND);
    

    在第一个例子中,它起作用,而“编辑”子菜单不在我的菜单按钮中。

    但随后我将一些菜单项添加到子菜单中:

    for (auto& groupInfo : mapGroups)
    {
        // first:  Group Name
        // second: Group Id
        const auto iMenuItemId = iMenuBase + groupInfo.second;
    
        pSubMenu->AppendMenu(MF_STRING, iMenuItemId, groupInfo.first);
    
    }
    

    它们被添加,我在按钮的子菜单中看到它们。

    现在,如果出于某种原因,我第二次运行此代码,它最终会将新的菜单项添加到菜单按钮中现有子菜单的底部。为什么?我想 RemoveMenu 将删除所有现有的子菜单项。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Andrew Truckle    1 年前

    我是这样做的:

    const auto menuCount = pSubMenu->GetMenuItemCount();
    for (int iMenuItem = 0; iMenuItem < menuCount; iMenuItem++)
    {
        pSubMenu->DeleteMenu(0, MF_BYPOSITION);
    }
    

    但我仍然不明白为什么我必须这样做,因为我想:

    pMenu->RemoveMenu(iMenuBase, MF_BYCOMMAND);
    

    …将删除弹出型按钮中的所有子菜单项。