C ++: Paso 1: ExtractIconEx. Paso 2: ??? Paso 3: SetMenuItemBitmaps

Estoy experimentando con la adición de iconos a una extensión de shell. Tengo este código (desinfectado para facilitar la lectura), que funciona:

InsertMenu(hmenu, index, MF_POPUP|MF_BYPOSITION, (UINT)hParentMenu, namestring);

El siguiente paso es este código:

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

¿Qué pongo para reemplazar los? S. Los intentos de Google de este conocimiento han encontrado muchos consejos que no conseguí que funcionaran. Se agradece cualquier consejo sobre cómo hacer que esto funcione, especialmente en máquinas antiguas (por ejemplo, no .net framework, no vista).

0
agregado editado
Puntos de vista: 1

2 Respuestas

Esto funciona, aunque el color de fondo es negro en lugar de transparente.

GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);
0
agregado
Aparentemente, Windows está haciendo algo inteligente para el ícono. El icono de orignal tenía menos transparencia de lo que pensaba, pero Windows decidió agregar una transparencia extraña. Dicho esto, el código anterior termina necesitando que se dibuje un mapa de bits usando drawicon entre los dos pasos.
agregado el autor Brian, fuente

Vista tiene soporte adecuado para los íconos en los menús, para pre Vista, debe usar elementos de menú de dibujar propietario (MF_OWNERDRAW) si desea íconos de color real de 16x16

Vista style menus... Vista style+pre Vista callback

0
agregado
Esa solución requiere Windows XP y el framework .net. Deseo evitar ambos.
agregado el autor Brian, fuente
Miraste el segundo enlace, tiene un código que funciona todo el camino de regreso a win95. El punto es, cualquier cosa antes de Vista, realmente necesitas hacer el dibujo tú mismo, así que puedes elegir si quieres usar GDI, GDI + o .Net
agregado el autor Anders, fuente