代码中的Win32更改菜单

Chr*_*ris 2 c++ windows winapi menuitem visual-studio

我不做很多windows编程但我似乎无法找到如何做到这一点......

我的应用程序有一个工具栏,允许用户打开和关闭某些功能.我有窗口识别何时单击其中一个工具栏,但其中一个选项使用"已检查"功能.

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

基本上我需要这个......

在此输入图像描述

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

在此输入图像描述

用户点击后

代码到目前为止......

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;
            }
Run Code Online (Sandbox Code Playgroud)

谢谢

Dav*_*nan 5

对于Win32,您可以使用GetMenuItemInfoSetMenuItemInfo函数执行此操作:

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

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


查看您发布的代码,(HMENU)IDR_MENU1看起来很可疑.我想这IDR_MENU1是一个标识符而不是标识符HMENU.铸造始终是潜在问题的标志.如果您没有HMENU牵手,请致电GetMenu获取.

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