InsertMenu/AppendMenu - 如何使用C++和win32在菜单和子菜单中添加图标

4
我使用C++和Win32编程编写了一个Shell扩展DLL上下文菜单程序。开发环境是Visual Studio 2008和2010。在下面的示例代码中,我正在尝试仅为主菜单添加菜单图标。菜单图标未显示在主菜单中。(我需要为所有菜单项添加图标。)
请纠正以下代码。
QueryContextMenu(HMENU hmenu, UINT /*uInd*/, UINT idCmdFirst, UINT /*idCmdLast*/, UINT /*uFlags*/ )
{


    int id = 1;

    HBITMAP hBitmap = NULL;

    hBitmap = (HBITMAP)LoadImage((HMODULE)_AtlBaseModule.m_hInst,MAKEINTRESOURCE(IDB_MYBITMAP), IMAGE_BITMAP, 12, 12, 0);


    HMENU submenu = CreatePopupMenu();

    AppendMenu(submenu, MF_STRING|MF_ENABLED, uidCmdFirst + id++, L"XP");
    AppendMenu(submenu, MF_STRING|MF_ENABLED,uidCmdFirst + id++, L"VISTA");
    AppendMenu(submenu, MF_STRING|MF_ENABLED,uidCmdFirst + id++, L"Win 7");

    InsertMenu(hmenu, 4,MF_BYPOSITION|MF_POPUP, UINT(submenu), L"Windows");
    SetMenuItemBitmaps(hmenu,id++, MF_BITMAP, hBitmap,hBitmap);


    return id;
}

SO不是一个调试服务。检查SetMenuItemBitmaps的返回值,并调用GetLastError以获取更详细的失败原因。提示:第三个参数无效。 - AJG85
1
谢谢AJG85。我已经找到了问题,我没有使用AppendMenu和CreatePopUpMenu,而是使用了CreateMenu和InsertMenu,它起作用了。 - TimeRun Cit
2
请您能否提供一个可运行的示例呢? - ST3
2个回答

1

阅读SetMenuItemBitmap的定义https://learn.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setmenuitembitmaps,并没有MF_BITMAP标志。

可选项为MF_BYCOMMAND和MF_BYPOSITION。看起来你正在尝试使用MF_BYCOMMAND,但必须使用已给出的菜单项相同的值。

您还需要检查BITMAP的格式。 SetMenuItemBitmaps仅接受单色位图。我在搜索如何做到这一点时在这里取得了成功。感谢您指引的方向。


1
CreatePopUpMenu同样有效。您只需要使用InsertMenu而不是AppendMenu即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接