Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 浏览器上下文菜单的外壳扩展,图标打断了经典Windows设计中的对齐_C++_Icons_Contextmenu_Explorer_Shell Extensions - Fatal编程技术网

C++ 浏览器上下文菜单的外壳扩展,图标打断了经典Windows设计中的对齐

C++ 浏览器上下文菜单的外壳扩展,图标打断了经典Windows设计中的对齐,c++,icons,contextmenu,explorer,shell-extensions,C++,Icons,Contextmenu,Explorer,Shell Extensions,我有以下问题 当为windows资源管理器的上下文菜单添加条目且windows 7设计设置为经典时,图标会打断菜单的对齐 此图片显示添加条目前的菜单(请注意Microsoft Security Essentials的图标): 添加菜单项后,如下所示: 您可以看到,Microsoft Security Essentials的图标和菜单标题之间有一个空格。使用的位图是标准的bmp 16 x 16 有人知道为什么会这样吗?再一次,这只发生在Win 7经典设计中,其他设计与预期一样有效 提前谢谢你的

我有以下问题

当为windows资源管理器的上下文菜单添加条目且windows 7设计设置为经典时,图标会打断菜单的对齐

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

添加菜单项后,如下所示:

您可以看到,Microsoft Security Essentials的图标和菜单标题之间有一个空格。使用的位图是标准的bmp 16 x 16

有人知道为什么会这样吗?再一次,这只发生在Win 7经典设计中,其他设计与预期一样有效

提前谢谢你的帮助

编辑:

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

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());
}

}您的原始代码是正确的。。。不要使用IconToBitmap函数,因为当指定IMAGE\u位图时,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());
}
iconHandle=LoadImageW(NULL,iconPath.c_str(),图像位图,0,0,LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE);
MENUITEMINFOW contextEntryAppSuite={sizeof(contextEntryAppSuite)};
contextMenuItem.fMask=MIIM_字符串| MIIM_状态| MIIM_位图| MIIM_FTYPE | MIIM_ID;
contextMenuItem.dwTypeData=标题;
contextMenuItem.wID=0;
contextMenuItem.fType=MFT_字符串;
contextMenuItem.fState=MFS_已启用;
contextMenuItem.hbmpItem=静态_转换(iconHandle);
MENUINFO MENUINFO;
menuInfo.cbSize=sizeof(menuInfo);
menuInfo.fMask=MIM_样式;
menuInfo.dwStyle=MNS\u CHECKORBMP;
SetMenuInfo(hMenu和menuInfo);
if(!InsertMenuItem(hMenu、indexMenu、TRUE和contextMenuItem))
{       
从_WIN32返回HRESULT_(GetLastError());
}

您的原始代码是正确的。。。不要使用IconToBitmap函数,因为当指定IMAGE\u位图时,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());
}
iconHandle=LoadImageW(NULL,iconPath.c_str(),图像位图,0,0,LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE);
MENUITEMINFOW contextEntryAppSuite={sizeof(contextEntryAppSuite)};
contextMenuItem.fMask=MIIM_字符串| MIIM_状态| MIIM_位图| MIIM_FTYPE | MIIM_ID;
contextMenuItem.dwTypeData=标题;
contextMenuItem.wID=0;
contextMenuItem.fType=MFT_字符串;
contextMenuItem.fState=MFS_已启用;
contextMenuItem.hbmpItem=静态_转换(iconHandle);
MENUINFO MENUINFO;
menuInfo.cbSize=sizeof(menuInfo);
menuInfo.fMask=MIM_样式;
menuInfo.dwStyle=MNS\u CHECKORBMP;
SetMenuInfo(hMenu和menuInfo);
if(!InsertMenuItem(hMenu、indexMenu、TRUE和contextMenuItem))
{       
从_WIN32返回HRESULT_(GetLastError());
}

如何将图标添加到菜单项?使用hbmpItem字段或ownerdraw?位图是这样加载的:iconHandle=LoadImageW(NULL,iconPath.c_str(),IMAGE_bitmap,0,0,LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE);并添加了hbmpItem字段:contextMenuItem.hbmpItem=static_cast(iconHandle);Windows Vista+请求32位预乘alpha RGB位图。因此,请尝试创建正确的位图。你可以在这里找到一些代码:谢谢你的帮助。不幸的是,使用给定示例中的代码没有帮助,问题仍然存在。能否显示添加新菜单项的代码?如何将图标添加到菜单项?使用hbmpItem字段或ownerdraw?位图是这样加载的:iconHandle=LoadImageW(NULL,iconPath.c_str(),IMAGE_bitmap,0,0,LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE);并添加了hbmpItem字段:contextMenuItem.hbmpItem=static_cast(iconHandle);Windows Vista+请求32位预乘alpha RGB位图。因此,请尝试创建正确的位图。你可以在这里找到一些代码:谢谢你的帮助。不幸的是,使用给定示例中的代码没有帮助,问题仍然存在。能否显示添加新菜单项的代码?
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());
}