我目前正在编写Windows资源管理器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!!!
}
但是现在菜单项放在上下文菜单中间的某个位置而不是最后。仅设置-1
而不是uMenuIndex
不起作用。菜单项确实放在最后但未显示位图。
有什么想法吗?
答案 0 :(得分: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;
您忽略了菜单主持人提供的有关菜单项放置位置的说明。到目前为止你看到成功的唯一原因是因为菜单主持人在你添加了你的菜单后没有添加任何其他项目,所有其他菜单扩展都按规则播放并在他们被告知的地方添加了他们的项目。如果他们决定忽略像你这样的规则,那么他们最终可能会结束而不是你的。