C++: Шаг 1: ИзвлечьIconEx. Шаг 2: ??? Шаг 3: SetMenuItemBitmaps

Я экспериментирую с добавлением значков в расширение оболочки. У меня есть этот код (дезинфицированный для удобства чтения), который работает:

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

Что мне вставить, чтобы заменить ?'s. Попытки гуглить эти знания нашли много советов, которые мне не удалось заставить работать. Приветствуются любые советы о том, как заставить это работать, особенно на старых машинах (например, без .net framework, без Vista).


person Community    schedule 18.09.2008    source источник


Ответы (2)


Vista имеет надлежащую поддержку значков в меню, до Vista вы должны использовать элементы меню рисования владельца (MF_OWNERDRAW), если вам нужны настоящие полноцветные значки 16x16.

Меню в стиле Vista... Обратный вызов в стиле Vista+до Vista

person Anders    schedule 18.09.2008
comment
Это решение требует Windows XP и .net framework. Я хочу избежать обоих. - person Brian; 19.09.2008
comment
Вы смотрели на 2-ю ссылку, у нее есть код, работающий вплоть до win95. Дело в том, что все, что было до Vista, вам действительно нужно рисовать самостоятельно, поэтому вы можете свободно выбирать, хотите ли вы использовать GDI, GDI+ или .Net. - person Anders; 27.09.2008

Это работает, хотя цвет задней панели черный, а не прозрачный.

GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);
person Brian    schedule 19.09.2008
comment
Судя по всему, Windows делает что-то хитрое со значком. Оригинальный значок был менее прозрачным, чем я думал, но Windows решила добавить странную прозрачность. Тем не менее, приведенный выше код в конечном итоге требует отрисовки растрового изображения с помощью drawicon между двумя шагами. - person Brian; 19.09.2008