Vivek Kumar
Vivek Kumar

Reputation: 5050

Removing menu in MFC

In MFC how to remove a menu-item of POPUP type. RemoveMenu() either take ID or position. Since, there is no ID for POPUP menu, option left is by using position.

But I am not getting how and where I can call RemoveMenu().

File  Edit  Test
            Test_submenu_1
            Test_submenu_2
            Test_submenu_3 > submenu_3_item_1
            Test_submenu_4
            Test_submenu_5

I want to remove Test_submenu_3? I am not getting how do find CMenu object for Test so that I can call RemoveMenu() by passing position "2" for submenu_3_item_1.

Any suggestion for doing this will be greatly appreciated.

Thanks!

Upvotes: 7

Views: 10216

Answers (4)

You can use this below code to remove the submenu, by comparing name

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;
      }
    }
}

Upvotes: 0

JohnCz
JohnCz

Reputation: 1609

You cannot use LoadMenu, since this function does just that.

After modifying loaded menu it is killed when menu object used to load it goes out of scope. You have to modify menu that is currently used.

Your menu is a popup part of the main menu, second in position. It contains 5 items and second one is another popup. To my understanding, you want to remove this item and popup of this item. To make it work you will have to ask main window for the current menu:

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

Of course, this code is from the main frame. If you want to use it elsewhere, you will have to access all using pointer to the main frame.

Upvotes: 8

Nerdtron
Nerdtron

Reputation: 1526

Try the below. You get the Test sub-menu first (index 2), then once you have that you tell it to remove its Test_submenu_3 submenu by position (also 2).

CMenu topMenu;
topMenu.LoadMenu(IDR_YOUR_MENU);
CMenu& testSubMenu = *topMenu.GetSubMenu(2);
testSubMenu.RemoveMenu(2,MF_BYPOSITION);

Upvotes: 1

snowdude
snowdude

Reputation: 3874

'Test' is the 3rd menu item (by position) on the top level menu. It's just been rendered horizontally rather than vertically. Assuming you have a handle to the top level menu use the same code you'd use to the get the sub menus as you would to get the 'Test' menu.

Upvotes: 0

Related Questions