C++ 如何在MFC中设置菜单项旁边的复选标记?

C++ 如何在MFC中设置菜单项旁边的复选标记?,c++,events,menu,mfc,C++,Events,Menu,Mfc,对话框顶部有一个菜单栏,其中一个选项是“mode”,其中包含“normal”和“debug”。我正在尝试这样做,当用户单击这两个选项中的任何一个时,下拉菜单中最后一个选中的项目旁边会出现一个复选标记 这是我在谷歌搜索时发现的,但我无法让它工作: //event handler for user clicking on mode then normal in the menu void CNew_RGB_ControlDlg::OnModeNormal() { //check the n

对话框顶部有一个菜单栏,其中一个选项是“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
}
我还有另外一个函数,用于在单击调试时切换选中和未选中的代码

返回值使它看起来好像应该根据工作,但菜单项永远不会更改

我也试过:

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

我做错了什么?我需要做些什么才能使此工作正常?

在选择项目时,您需要获取对话框中使用的当前菜单,而不是加载新菜单,如

CMenu *pMenu = GetMenu();
if (pMenu != NULL)
{   pMenu->CheckMenuItem(ID_MODE_NORMAL, MF_CHECKED | MF_BYCOMMAND);
    pMenu->CheckMenuItem(ID_MODE_DEBUG, MF_UNCHECKED | MF_BYCOMMAND);
}

将您的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;

    };

有什么方法可以选中/取消选中主菜单栏上的菜单项

我的旧代码(来自视图类)

不再适用于VC++2010。他们说这与浮动工具栏和/或活动可访问性有关


Nat Hager

在基于对话框的应用程序中,对于一些信息(可能已经过时)和一个类似的问题,这一直是一个难题。
CWnd* pParent = GetParent();
CMenu* pMenu  = pParent->GetMenu();
pMenu->CheckMenuItem(ID_TEST_1, MF_UNCHECKED);
pMenu->CheckMenuItem(ID_TEST_2, MF_UNCHECKED);