在 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()
之前设置 cbSize
和 fMask
字段。
试试这个:
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);
我正在尝试切换菜单项旁边的复选框,并更改代码中的布尔值以对应是否选中菜单项。
我的 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()
之前设置 cbSize
和 fMask
字段。
试试这个:
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);