如何在具有子菜单项的菜单项上打上复选标记。 (Visual Studio 2008 C++/MFC)

问题描述:

我有一个包含子菜单的菜单。如何在具有子菜单项的菜单项上打上复选标记。 (Visual Studio 2008 C++/MFC)

例如:

  • 的Item1
  • 项目2
  • 项目3
    • 项目A
    • 项B

Item3在其下有项目。

在任何给定的时间1,2或应该检查3下的项目。由于我没有Item3的ID,所以当我尝试设置对Item3的检查以指示其子女中有一个复选标记时,我不得不使用MF_BYPOSITION指示符。如果选中A或B,Item3应该有复选标记。我能够检查项目1和2以及A和B - 但无法确定项目3。

我无法成功使用::CheckMenuItem()ModifyMenu()来设置复选标记。

有人可以指出一个成功的例子吗?文件似乎表明它可以完成,但我一直无法做到。

编辑

这对于被设定为一个DLG箱菜单中的菜单。菜单栏有三个项目 - 其中一个下降到上面显示的内容。

请注意,它被用作右键单击的弹出窗口,但我会采取任何建议以在任何情况下工作。

+0

这是一个弹出菜单或菜单栏的一部分? – flashk 2010-08-04 17:50:29

+0

@flashk查看编辑 – Tim 2010-08-04 18:09:47

我以前做过这个弹出菜单。您需要按位置访问子菜单,而不是ID。使用上述(三)项的例子是在位置2:

CMenu popupMenu; 
popupMenu.LoadMenu(IDR_MYMENU); 
popupMenu.GetSubMenu(0)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED); 
. 
. 
. 
popupMenu.GetSubMenu(0)->TrackPopupMenu(...); 

不过,我还没有在菜单栏的项目做到了这一点。

编辑由Tim的OP:

为了完整

为了得到它与菜单项工作,你必须得到HMENU

// MENU_POSITION is the zero based location of the menu you want to use. (file, edit, view, help... etc) 
HMENU mainMenu = ::GetMenu(m_hWnd); 
HMENU subMenu = GetSubMenu(mainMenu, MENU_POSITION); 
SetMenuState(subMenu); 
+0

那么,它适用于我的弹出菜单/上下文菜单,但不适用于菜单栏之一。真是麻烦。有一种方法可以做到这一点,我还没有尝试过。 – Tim 2010-08-04 19:18:43

+0

我得到它的工作。问题在于我一直在通过HMENUs来采用一种常用的方法。根据它被调用的位置,它可以是右键单击弹出菜单或框架的hmenu。按位置使用时不能对待相同的东西。所有其他设置都通过id工作。 – Tim 2010-08-04 20:05:51

几分钟前我也有类似问题 - 一个包含至少一个子菜单的标准MFC菜单栏,并且需要能够向子菜单添加复选标记,当子菜单中的任一子项它EMS检查。

最简单的解决方案(对我来说)很简单,就像在标准的OnUpdateMenuItem(CCmdUI * pCmdUI)调用中执行更新一样简单。在我的情况下,我使用ON_UPDATE_COMMAND_UI_RANGE()将一堆菜单ID提供给同一个更新调用,但主体对于单个ON_UPDATE_COMMAND_UI()映射是相同的。

我使用的代码(编辑更加容易地插入到其他人的工作)是:

void CMyApp::OnUpdateMenu(CCmdUI* pCmdUI) 
{ 
    // Note, a submenu parent (which has no editable ID in the resource editor) has the SAME ID as the first child item 
    if (pCmdUI->m_nID == ID_FIRST_CHILD_MENU && pCmdUI->m_pSubMenu != NULL) { 
     // Get the child menu so we can see if any child items are checked 
     CMenu* pSubMenu = pCmdUI->m_pSubMenu; 
     BOOL fChildChecked = FALSE; 
     for (UINT i = 0; !fChildChecked && i < pSubMenu->GetMenuItemCount(); ++i) { 
     // Do something to decide if this child item should be checked... 
     UINT nChildID = pSubMenu->GetMenuItemID(i); 
     fChildChecked = IsThisChildChecked(nChildID); 
     } 

     // The POSITION of the current menu item is stored in pCmdUI->m_nIndex 
     CMenu* pMenu = pCmdUI->m_pMenu; 
     UINT flags = MF_BYPOSITION; 
     if (fActiveChild) flags |= MF_CHECKED; 
     pMenu->CheckMenuItem(pCmdUI->m_nIndex, flags); 
    } 

    // Set the enabled state of the menu item as you see fit... 
    pCmdUI->Enable(TRUE); 
} 

的Et瞧子菜单项自动地获得复选标记,当任何其子菜单项有复选标记。

希望这可以帮助其他人寻找类似的解决方案!

约翰

+0

太好了 - 谢谢。我会试试看。 – Tim 2012-08-07 15:59:02