2012-09-26 81 views
7

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

但我没有得到如何以及在哪里可以调用RemoveMenu()。

 
File Edit Test 
      Test_submenu_1 
      Test_submenu_2 
      Test_submenu_3 > submenu_3_item_1 
      Test_submenu_4 
      Test_submenu_5 

我想删除Test_submenu_3?我没有得到如何找到测试的CMenu对象,以便我可以通过为子菜单_3_item_1传递位置“2”来调用RemoveMenu()。

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

谢谢!

回答

7

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

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

您的菜单是主菜单的弹出部分,位置第二。它包含5个项目,第二个是另一个弹出窗口。据我的理解,你想删除这个项目并弹出这个项目。 为了使它工作,你将不得不问主窗口显示当前菜单:

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

当然,这个代码是从主框架。如果你想在其他地方使用它,你将不得不使用指向主框架的指针。

0

“测试”是顶级菜单上的第三个菜单项(按位置)。它只是被水平渲染而不是垂直渲染。假设你有一个顶层菜单的句柄,你可以使用相同的代码来获取子菜单,就像你想得到'测试'菜单一样。

0

请尝试以下操作。你首先得到测试子菜单(索引2),然后一旦你有,你告诉它按位置(也是2)删除它的Test_submenu_3子菜单。

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