用于资源管理器上下文菜单的Shell扩展,图标在经典Windows设计中中断对齐

时间:2015-05-19 12:42:16

标签: c++ icons contextmenu explorer shell-extensions

我有以下问题,

为Windows资源管理器的上下文菜单添加条目并且Windows 7设计设置为经典时,图标会破坏菜单的对齐方式。

此图片显示添加条目前的菜单(请参阅Microsoft Security Essentials的图标):

normal behaviour

添加菜单条目后,它看起来像这样:

wrong behaviour

您会看到Microsoft Security Essentials图标与菜单标题之间存在空格。使用的位图是标准的bmp 16 x 16。

有谁知道为什么会这样?再一次,这只发生在Win 7经典设计中,其他设计按预期工作。

提前感谢您的帮助

编辑:

这是我添加项目的初始代码:

PART_HorizontalScrollBar

在你帮忙后我改变了:

iconHandle = LoadImageW(NULL, iconPath.c_str(), IMAGE_BITMAP, 0, 0,   LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE);   

MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
contextMenuItem.fMask =  MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;
contextMenuItem.dwTypeData = caption;       
contextMenuItem.wID = 0;  
contextMenuItem.fType = MFT_STRING;
contextMenuItem.fState = MFS_ENABLED;
contextMenuItem.hbmpItem = static_cast<HBITMAP>(iconHandle);
if(!InsertMenuItemW(hMenu, indexMenu, TRUE, &contextMenuItem))
{       
    return HRESULT_FROM_WIN32(GetLastError());
}

为:

contextMenuItem.hbmpItem = static_cast<HBITMAP>(iconHandle);

}

1 个答案:

答案 0 :(得分:2)

你的原始代码是正确的......不要打扰那个IconToBitmap函数,因为当指定IMAGE_BITMAP时你的LoadImageW会返回HBITMAP。

在XP上使用位图或在更高版本的Windows上使用经典主题的菜单似乎为复选标记保留空间,有时需要使用MNS_CHECKORBMP调用SetMenuInfo ...尝试以下代码:

iconHandle = LoadImageW(NULL, iconPath.c_str(), IMAGE_BITMAP, 0, 0,   LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE);   

MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
contextMenuItem.fMask =  MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;
contextMenuItem.dwTypeData = caption;       
contextMenuItem.wID = 0;  
contextMenuItem.fType = MFT_STRING;
contextMenuItem.fState = MFS_ENABLED;
contextMenuItem.hbmpItem = static_cast<HBITMAP>(iconHandle);

MENUINFO menuInfo;
menuInfo.cbSize = sizeof(MENUINFO);
menuInfo.fMask = MIM_STYLE;
menuInfo.dwStyle = MNS_CHECKORBMP;
SetMenuInfo(hMenu, &menuInfo);

if(!InsertMenuItemW(hMenu, indexMenu, TRUE, &contextMenuItem))
{       
    return HRESULT_FROM_WIN32(GetLastError());
}