Я экспериментирую с добавлением значков в расширение оболочки. У меня есть этот код (продезинфицированный для удобства чтения), который работает:
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);
Что мне вставить для замены? Попытки найти это знание в Google дали много советов, которые мне не удалось заставить работать. Приветствуются любые советы по тому, как заставить это работать, особенно на старых машинах (например, без .net framework, без перспективы).





Vista имеет надлежащую поддержку значков в меню, до Vista вы должны использовать элементы меню рисования владельцем (MF_OWNERDRAW), если вам нужны настоящие полноцветные значки 16x16.
Меню в стиле Vista ...Стиль Vista + обратный вызов до Vista
Вы смотрели на вторую ссылку, там код работает вплоть до win95. Дело в том, что все, что было до Vista, вам действительно нужно рисовать самостоятельно, поэтому вы можете выбрать, хотите ли вы использовать GDI, GDI + или .Net.
Это работает, хотя задний цвет черный, а не прозрачный.
GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);
Видимо винда что-то хитрит со значком. Оригинальный значок имел меньшую прозрачность, чем я думал, но Windows решила добавить странную прозрачность. Тем не менее, приведенный выше код требует, чтобы растровое изображение было нарисовано с помощью drawicon между двумя шагами.
Это решение требует Windows XP и .NET Framework. Я хочу избежать обоих.