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

Toggle Windows Menu Item Checkbox in C++

本文关键字:菜单 复选框 Windows 切换      更新时间:2023-10-16

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

我的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);