代码之家  ›  专栏  ›  技术社区  ›  Ari Seyhun

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

  •  1
  • Ari Seyhun  · 技术社区  · 7 年前

    我有一个 case 在我的 switch (message) { ... } 在我的 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'
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Remy Lebeau    7 年前

    GetMenuItemInfo() SetMenuItemInfo() 需要指向已分配 MENUITEMINFO 实例,但您正在向它们传递一个指向未初始化的 MENUITEMINFO* 而是指针。这就是为什么你会出错。

    您还必须设置 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);