Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ C++;:步骤1:提取IConex。第二步:???步骤3:SetMenuItemBitmap_C++_Winapi_Icons - Fatal编程技术网

C++ C++;:步骤1:提取IConex。第二步:???步骤3:SetMenuItemBitmap

C++ C++;:步骤1:提取IConex。第二步:???步骤3:SetMenuItemBitmap,c++,winapi,icons,C++,Winapi,Icons,我正在尝试向shell扩展添加图标。我有以下代码(经过消毒以便于阅读): InsertMenu(hmenu, index, MF_POPUP|MF_BYPOSITION, (UINT)hParentMenu, namestring); 下一步是此代码: HICON hIconLarge, hIconSmall; ICONINFO oIconInfo; ExtractIconEx("c:\\progra~1\\winzip\\winzip32.exe", 0, &hIconLarge,

我正在尝试向shell扩展添加图标。我有以下代码(经过消毒以便于阅读):

InsertMenu(hmenu, index, MF_POPUP|MF_BYPOSITION, (UINT)hParentMenu, namestring);
下一步是此代码:

HICON hIconLarge, hIconSmall;
ICONINFO oIconInfo;
ExtractIconEx("c:\\progra~1\\winzip\\winzip32.exe", 0, &hIconLarge, &hIconSmall, 1);
GetIconInfo(hIconSmall, &oIconInfo);
//???????
SetMenuItemBitmaps(hParentMenu, indexMenu-1, MF_BITMAP | MF_BYPOSITION, hbmp, hbmp);

我应该投些什么来代替这些。用谷歌搜索这些知识的尝试发现了许多我没能找到的技巧。对于如何使其正常工作,特别是在较旧的机器上(例如,没有.net framework,没有vista),我们非常感谢您的建议。

vista对菜单中的图标提供了适当的支持,对于vista之前的版本,如果您想要真正的16x16全彩色图标,您必须使用所有者绘制菜单项(MF_OWNERDRAW)


Vista对菜单中的图标有适当的支持,对于Vista之前的版本,如果您想要真正的16x16全彩色图标,则必须使用owner draw菜单项(MF_OWNERDRAW)


尽管背面颜色是黑色而不是透明,但这是可行的

GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);

这是可行的,尽管背景色是黑色而不是透明的

GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);

该解决方案需要windows XP和.net framework。我希望避免这两种情况。你看了第二个链接了吗,它的代码一直运行到win95。关键是,在Vista之前,您确实需要自己绘制图形,因此您可以自由选择是否要使用GDI、GDI+或.net。该解决方案需要windows XP和.net framework。我希望避免这两种情况。你看了第二个链接了吗,它的代码一直运行到win95。关键是,在Vista之前,您确实需要自己绘制图形,因此您可以自由选择是否要使用GDI、GDI+或。显然,Windows正在对图标进行巧妙的处理。原始图标的透明度比我想象的要低,但Windows决定添加奇怪的透明度。也就是说,上面的代码最终需要在两个步骤之间使用drawicon绘制位图。显然,Windows对图标做了一些巧妙的处理。原始图标的透明度比我想象的要低,但Windows决定添加奇怪的透明度。也就是说,上面的代码最终需要在两个步骤之间使用drawicon绘制位图。