如何在具有子菜单项的菜单项上打上复选标记。 (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箱菜单中的菜单。菜单栏有三个项目 - 其中一个下降到上面显示的内容。
请注意,它被用作右键单击的弹出窗口,但我会采取任何建议以在任何情况下工作。
我以前做过这个弹出菜单。您需要按位置访问子菜单,而不是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);
几分钟前我也有类似问题 - 一个包含至少一个子菜单的标准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瞧子菜单项自动地获得复选标记,当任何其子菜单项有复选标记。
希望这可以帮助其他人寻找类似的解决方案!
约翰
太好了 - 谢谢。我会试试看。 – Tim 2012-08-07 15:59:02
这是一个弹出菜单或菜单栏的一部分? – flashk 2010-08-04 17:50:29
@flashk查看编辑 – Tim 2010-08-04 18:09:47