7

在 MFC 中如何删除 POPUP 类型的菜单项。RemoveMenu() 获取 ID 或位置。因为弹出菜单没有 ID,所以左边的选项是使用位置。

但我不知道如何以及在何处调用 RemoveMenu()。

文件编辑测试
            测试子菜单_1
            测试子菜单_2
            Test_submenu_3 > submenu_3_item_1
            测试子菜单_4
            测试子菜单_5

我想删除 Test_submenu_3?我不知道如何为 Test 找到 CMenu 对象,以便我可以通过为 submenu_3_item_1 传递位置“2”来调用 RemoveMenu()。

任何这样做的建议将不胜感激。

谢谢!

4

4 回答 4

8

您不能使用 LoadMenu,因为此功能就是这样做的。

修改加载的菜单后,当用于加载它的菜单对象超出范围时,它会被杀死。您必须修改当前使用的菜单。

您的菜单是主菜单的弹出部分,排在第二位。它包含 5 个项目,第二个是另一个弹出窗口。据我了解,您要删除此项目并弹出此项目。要使其正常工作,您必须向主窗口询问当前菜单:

CMenu* pMenu = GetMenu(); // get the main menu
CMenu* pPopupMenu = pMenu->GetSubMenu(2);//(Test menu with item....)
pPopupMenu->RemoveMenu(2, MF_BYPOSITION);

当然,这段代码来自主框架。如果您想在其他地方使用它,则必须使用指向主框架的指针来访问所有内容。

于 2012-09-27T04:09:22.460 回答
1

试试下面的。你首先得到 Test 子菜单(索引 2),然后一旦你告诉它按位置删除它的 Test_submenu_3 子菜单(也是 2)。

CMenu topMenu;
topMenu.LoadMenu(IDR_YOUR_MENU);
CMenu& testSubMenu = *topMenu.GetSubMenu(2);
testSubMenu.RemoveMenu(2,MF_BYPOSITION);
于 2012-09-26T14:13:03.757 回答
0

“测试”是顶层菜单上的第三个菜单项(按位置)。它只是水平渲染而不是垂直渲染。假设您有顶级菜单的句柄,使用与获取“测试”菜单相同的代码来获取子菜单。

于 2012-09-26T13:34:49.893 回答
0

您可以使用下面的代码通过比较名称来删除子菜单

bool RemoveSubmenu(CMenu * pMenu) {
 for (int pos = 0; pos < pMenu->GetMenuItemCount(); pos++) {

      wchar_t *name = new wchar_t[mf.cch + 1];
      MENUITEMINFO mf;

      ZeroMemory(&mf, sizeof(mf)); 
      mf.cbSize = sizeof(mf);
      mf.fMask = MIIM_SUBMENU | MIIM_FTYPE | MIIM_STRING;
      mf.fType = MIIM_STRING;
      mf.dwTypeData = NULL;
      
      if (!GetMenuItemInfo(pMenu->m_hMenu, pos, TRUE, &mf))
        break;

      if (mf.hSubMenu != NULL){

        mf.fMask = MIIM_TYPE;
        mf.fType = MFT_STRING;
        ++mf.cch;

        mf.dwTypeData = (LPSTR)name;

        if (!GetMenuItemInfo(pMenu->m_hMenu, pos, TRUE, &mf)){
         bRet = false;
         break;
        }

        //
        // compare sub menu name (i.e mf.dwTypeData) here, do the required
        // modifications
        //
          
        pMenu->RemoveMenu(pos, MF_BYPOSITION);
        bRet = true;

        break;
      }
    }
}
于 2021-09-13T15:00:56.090 回答