1

我目前正在编写一个 Windows Explorer Shell 扩展。到目前为止一切都很好,但我无法在上下文菜单的末尾插入带有 MenuItemBitmaps 的菜单项。

这是我在没有位图的情况下使用的代码:

HRESULT CSimpleShlExt::QueryContextMenu(HMENU hmenu, UINT /*uMenuIndex*/, UINT uidFirstCmd, UINT /*uidLastCmd*/, UINT uFlags)
{
    InsertMenu(hmenu, -1, MF_SEPARATOR, uidFirstCmd++, _T(""));
    InsertMenu(hmenu, -1, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item"));
    InsertMenu(hmenu, -1, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item 2"));
    return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 3); // 3 because we do have three menu items!!!
}

这段代码做我想要的。当我在 Windows 资源管理器中单击鼠标右键时,它会在上下文菜单的末尾添加一个分隔符和两个菜单项。

我还可以使用以下代码将位图添加到这些菜单项:

HRESULT CSimpleShlExt::QueryContextMenu(HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, UINT /*uidLastCmd*/, UINT uFlags)
{
    // load the bitmap from the resource
    HBITMAP hBitmap = (HBITMAP)LoadImage((HMODULE)_AtlBaseModule.m_hInst,
        MAKEINTRESOURCE(IDB_BITMAP), IMAGE_BITMAP, 16, 16, 0);
    InsertMenu(hmenu, uMenuIndex++, MF_SEPARATOR, uidFirstCmd++, _T(""));
    InsertMenu(hmenu, uMenuIndex++, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item"));
    SetMenuItemBitmaps(hmenu, uMenuIndex - 1, MF_BITMAP | MF_BYPOSITION, hBitmap, hBitmap);
    InsertMenu(hmenu, uMenuIndex++, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item 2"));
    SetMenuItemBitmaps(hmenu, uMenuIndex - 1, MF_BITMAP | MF_BYPOSITION, hBitmap, hBitmap);
    return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 3); // 3 because we do have three menu items!!!
}

但是现在菜单项被放置在上下文菜单中间的某个位置,而不是最后。简单地设置-1uMenuIndex不是不起作用。菜单项确实放在最后,但未显示位图。

有任何想法吗?

4

1 回答 1

3

的文档SetMenuItemBitmaps没有说明-1像接受这样的有效职位InsertMenu。您知道已添加项目的命令 ID,并且您知道它们是唯一的,因此按命令而不是按位置添加位图。

InsertMenu(hmenu, -1, MF_STRING | MF_BYPOSITION, uidFirstCmd, _T("SimpleShlExt Test Item"));
SetMenuItemBitmaps(hmenu, uidFirstCmd, MF_BITMAP | MF_BYCOMMAND, hBitmap, hBitmap);
++uidFirstCmd;

您忽略了菜单主持人给您的关于将菜单项放在何处的说明。到目前为止,您看到成功的唯一原因是菜单主机在您添加您的项目后没有添加任何其他项目,并且所有其他菜单扩展程序都按照规则播放并添加了他们被告知的项目。如果他们决定像您一样无视规则,那么他们最终可能会最终而不是您的规则。

于 2010-03-03T09:53:35.580 回答