代码中的Win32更改菜单

时间:2012-01-24 14:34:49

标签: c++ windows visual-studio winapi menuitem

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

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

问题是如何在我的代码中知道这是当前的真或假,以及如何在我的代码中将其设置为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;
            }

由于

1 个答案:

答案 0 :(得分: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);

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


查看您发布的代码,(HMENU)IDR_MENU1似乎很可疑。我认为IDR_MENU1是标识符而不是HMENU。铸造始终是潜在问题的标志。如果您没有HMENU,请致电GetMenu以获取它。

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