如何设置检查菜单项 mfc c++

Posted

技术标签:

【中文标题】如何设置检查菜单项 mfc c++【英文标题】:How to set check on menu item mfc c++ 【发布时间】:2011-12-22 09:07:09 【问题描述】:

如何在 mfc c++ 菜单项上设置检查我尝试了这个,但是,总是未选中的菜单项。

CString tcBuff; 
    CMenu popMenu;
    popMenu.LoadMenu(nMenuID);

    if (text.Compare(defaultconfig) == 0)
    

        tcBuff.LoadStringW(IDC_DEFAULTREMOVE);
        popMenu.ModifyMenuW(ID_CONFIGURATION_DEFAULT,0,ID_CONFIGURATION_DEFAULT,tcBuff);
        popMenu.CheckMenuItem(IDC_DEFAULTREMOVE, MF_CHECKED || MF_BYCOMMAND);
    

感谢您的帮助。

【问题讨论】:

您正在修改一个新的 CMenu 对象,而不是您的应用程序中使用的 actual 菜单。也许是时候拿起a good book on C++ 并确保您了解 RAII? 感谢您的回答,我解决了我的问题:) 通常情况下,要检查您不这样做的菜单项。您应该使用 ON_UPDATE_COMMAND_UI(IDC_DEFAULTREMOVE, function) 来通过 ID 处理菜单项的函数。该函数有一个参数pCmdUI。因此,您可以在 if 块中执行 pCmdUI->SetCheck(TRUE);pCmdUI->SetText(tcBuff);。跨度> 【参考方案1】:

您需要| 运算符,而不是|| 运算符。

您想要组合 MF_CHECKEDMF_BYCOMMAND 位标志,您可以使用按位或运算来完成。这需要| 运算符。

将您的代码更改为如下所示:

popMenu.CheckMenuItem(IDC_DEFAULTREMOVE, MF_CHECKED | MF_BYCOMMAND);

|| 运算符是逻辑 OR 运算符。它实际上给了你这个:

0x8 /* MF_CHECKED */  ||  0x0 /* MF_BYCOMMAND */ == 0

相当于MF_UNCHECKED

【讨论】:

@nidhal:另一种可能性(也是我第一次看到的那个)是您正在创建和修改一个 new CMenu 对象,该对象一旦被自动销毁超出范围。您需要修改应用程序中的 actual 菜单。问题中没有足够的代码来实际查看正在发生的事情。使用了许多未声明的变量。【参考方案2】:

尝试在语句popMenu.CheckMenuItem(IDC_DEFAULTREMOVE, MF_CHECKED || MF_BYCOMMAND)中使用ID_CONFIGURATION_DEFAULT而不是IDC_DEFAULTREMOVE;

ID_CONFIGURATION_DEFAULT - 命令 ID IDC_DEFAULTREMOVE - 字符串资源 ID

【讨论】:

以上是关于如何设置检查菜单项 mfc c++的主要内容,如果未能解决你的问题,请参考以下文章

mfc 菜单项变灰

MFC - 选中/取消选中菜单项

如何将消息映射添加到 MFC 中的动态菜单项

MFC SDI 应用程序,如何更改菜单项的标题?

MFC 菜单项复选框行为

了解用户是不是选择了子菜单项 MFC