c++ - Win32 在代码中更改菜单

标签 c++ windows visual-studio winapi menuitem

我没有做过很多 Windows 编程,但我似乎无法找到如何做到这一点...

我的应用程序有一个工具栏,允许用户打开和关闭某些功能。当单击这些工具栏之一时,我有窗口可以识别,但是其中一个选项使用“已检查”功能。

问题是我如何知道这在我的代码中是当前的 true 还是 false,以及如何在我的代码中将其设置为 false?

基本上我需要这个...

enter image description here

看起来像这样......

enter image description here

用户点击后

到目前为止的代码...

switch (wmId)
        {
        case ID_SETTINGS_ENABLEGRAVITY:
            {
                MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
                mii.fMask = MIIM_STATE;
                GetMenuItemInfo((HMENU)IDR_MENU1,ID_SETTINGS_ENABLEGRAVITY, FALSE, &mii);
                mii.fState ^= MFS_CHECKED;

                SetMenuItemInfo((HMENU)IDR_MENU1,ID_SETTINGS_ENABLEGRAVITY, FALSE, &mii);
                break;
            }

谢谢

最佳答案

对于 Win32,您可以使用 GetMenuItemInfo 执行此操作和 SetMenuItemInfo功能:

MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
mii.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, uItem, FALSE, &mii);
mii.fState ^= MFS_CHECKED;
SetMenuItemInfo(hMenu, uItem, FALSE, &mii);

此代码切换选中的属性。它假定您是通过 ID 而不是位置来识别菜单项。


查看您发布的代码,(HMENU)IDR_MENU1 看起来很可疑。我想 IDR_MENU1 是一个标识符而不是 HMENU。转换始终是潜在问题的标志。如果您手头没有 HMENU,请调用 GetMenu获取它。

在您的代码中,您应该测试 API 调用的返回值,如果它们返回 FALSE,那么您应该调用 GetLastError 以获取有关失败的更多信息。

关于c++ - Win32 在代码中更改菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8988606/

相关文章:

python - 为什么链接器在未在任何地方指定时寻找 python36_d.lib?

c++ - 哪种语言和库更适合高性能网络设备轮询服务器 (SNMP)?

c# - 在 .NET 中使用 NTFS 压缩来压缩文件夹

asp.net - 网站项目是否可以引用 Visual Studio 中签名的程序集?

c++ - Visual Studio中如何通过汇编输出信息

c++ - 如何显示类中的坐标?

c++ - OpenCV内存使用限制

c - 如何正确使用 CopyFileEx 和 CopyProgressRoutine 函数?

c - send() 和 receive() 使用一个套接字?

c++ - 如何编写一个简单的代码分析器?