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

时间:2014-07-23 13:43:29

标签: c++ events menu mfc

我的对话框顶部有一个菜单栏,其中一个选项是“mode”,其中包含“normal”和“debug”。我正在尝试这样做,以便当用户点击这两个选项中的任何一个时,下拉菜单中最后一个选定项目旁边会出现一个复选标记。

The menu I'm working with.

这是我在搜索谷歌时发现的,但我无法让它工作:

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

我做错了什么?我需要做些什么来完成这项工作?

3 个答案:

答案 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