我的对话框顶部有一个菜单栏,其中一个选项是“mode”,其中包含“normal”和“debug”。我正在尝试这样做,以便当用户点击这两个选项中的任何一个时,下拉菜单中最后一个选定项目旁边会出现一个复选标记。
这是我在搜索谷歌时发现的,但我无法让它工作:
//event handler for user clicking on mode then normal in the menu
void CNew_RGB_ControlDlg::OnModeNormal()
{
//check the normal option when the user selects normal mode in the menu
CMenu menu;
menu.LoadMenu(IDR_MENU1);
menu.CheckMenuItem(ID_MODE_NORMAL, MF_CHECKED | MF_BYCOMMAND); //returns 8
menu.CheckMenuItem(ID_MODE_DEBUG, MF_UNCHECKED | MF_BYCOMMAND);//returns 0
}
我还有另外一个这样的功能,用于点击调试时,只需切换选中和未选中的相同代码。
返回值使它看起来应该根据MSDN工作,但菜单项永远不会改变。
我也试过这个:
void CNew_RGB_ControlDlg::OnModeNormal()
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
menu.GetSubMenu(1)->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);
menu.GetSubMenu(1)->CheckMenuItem(1, MF_BYPOSITION|MF_CHECKED);
}
我做错了什么?我需要做些什么来完成这项工作?
答案 0 :(得分:2)
在选择项目时,您无需加载新菜单,而是需要获取对话框中使用的当前菜单,例如
CMenu *pMenu = GetMenu();
if (pMenu != NULL)
{ pMenu->CheckMenuItem(ID_MODE_NORMAL, MF_CHECKED | MF_BYCOMMAND);
pMenu->CheckMenuItem(ID_MODE_DEBUG, MF_UNCHECKED | MF_BYCOMMAND);
}
答案 1 :(得分:0)
将您的CMenu项声明为对话框类的成员,因此它在第一次加载资源后仍然存在,通过在处理程序中声明它并加载它,您每次都在菜单的不同副本上操作。你也可以每次使用:: GetMenu()动态加载它,如另一个响应所示。
在显示菜单之前创建菜单时,您必须检查所需的菜单项,并取消选中其他菜单项:
// in CNew_RGB_ControlDlg.h
CMenu menu;
// in CNew_RGB_ControlDlg::OnInitDialog
// no need to get submenu if you use the menu id
menu.LoadMenu(IDR_MENU1);
menu.CheckMenuItem(ID_NORMAL, MF_CHECKED);
menu.CheckMenuItem(ID_DEBUG, MF_UNCHECKED);
}
当您响应将其他菜单项设置为已选中的命令时
switch(Command)
{
case ID_NORMAL:
menu.CheckMenuItem(ID_NORMAL, MF_CHECKED);
menu.CheckMenuItem(ID_DEBUG, MF_UNCHECKED);
break;
case ID_DEBUG:
menu.CheckMenuItem(ID_NORMAL, MF_UNCHECKED);
menu.CheckMenuItem(ID_DEBUG, MF_CHECKED);
break;
};
答案 2 :(得分:0)
如何检查/取消选中主菜单栏上的菜单项?
我的旧代码(来自View Class)
CWnd* pParent = GetParent();
CMenu* pMenu = pParent->GetMenu();
pMenu->CheckMenuItem(ID_TEST_1, MF_UNCHECKED);
pMenu->CheckMenuItem(ID_TEST_2, MF_UNCHECKED);
不再适用于VC ++ 2010.他们说这与浮动工具栏和/或主动辅助功能有关。
Nat Hager