在 C++ 中切换 Windows 菜单项复选框

Toggle Windows Menu Item Checkbox in C++

我正在尝试切换菜单项旁边的复选框,并更改代码中的布尔值以对应是否选中菜单项。

我的 switch (message) { ... } 中有一个 case 在我的 WndProc 函数中用于特定菜单项。我还有一个布尔变量设置为 TRUE,我的菜单项默认选中。

这是我到目前为止尝试过的方法:

HMENU hmenu = GetMenu(hWnd);
LPMENUITEMINFO menuItem;
GetMenuItemInfo(hmenu, ID_OPTIONS_COMPUTERDELAY, FALSE, &menuItem);

if (menuItem->fState == MFS_CHECKED) {
    // Checked, uncheck it
    menuItem->fState = MFS_UNCHECKED;
    SetMenuItemInfo(hmenu, ID_OPTIONS_COMPUTERDELAY, FALSE, &menuItem);
} else {
    // Unchecked, check it
    menuItem->fState = MFS_CHECKED;
    SetMenuItemInfo(hmenu, ID_OPTIONS_COMPUTERDELAY, FALSE, &menuItem);
}

我收到以下错误(已更改行号以匹配上面的代码):

Line 3: argument of type "LPMENUITEMINFO *" is incompatible with parameter of type "LPMENUITEMINFOW"
Line 8: argument of type "LPMENUITEMINFO *" is incompatible with parameter of type "LPCMENUITEMINFOW"
Line 12: argument of type "LPMENUITEMINFO *" is incompatible with parameter of type "LPCMENUITEMINFOW"
Line 4: 'BOOL GetMenuItemInfoW(HMENU,UINT,BOOL,LPMENUITEMINFOW)': cannot convert argument 4 from 'LPMENUITEMINFO *' to 'LPMENUITEMINFOW'

GetMenuItemInfo()SetMenuItemInfo() 期望一个指向已分配 MENUITEMINFO 实例的指针,但您向它们传递了一个指向未初始化 MENUITEMINFO* 指针的指针。这就是您收到错误的原因。

您还必须在调用 GetMenuItemInfo() 之前设置 cbSizefMask 字段。

试试这个:

HMENU hmenu = GetMenu(hWnd);

MENUITEMINFO menuItem = {0};
menuItem.cbSize = sizeof(MENUITEMINFO);
menuItem.fMask = MIIM_STATE;

GetMenuItemInfo(hmenu, ID_OPTIONS_COMPUTERDELAY, FALSE, &menuItem);

if (menuItem.fState == MFS_CHECKED) {
    // Checked, uncheck it
    menuItem.fState = MFS_UNCHECKED;
} else {
    // Unchecked, check it
    menuItem.fState = MFS_CHECKED;
}
SetMenuItemInfo(hmenu, ID_OPTIONS_COMPUTERDELAY, FALSE, &menuItem);