C ++: Etapa 1: ExtractIconEx. Passo 2: ??? Etapa 3: SetMenuItemBitmaps

Estou experimentando adicionar ícones a uma extensão do shell. Eu tenho esse código (higienizado para facilitar a leitura), que funciona:

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

O próximo passo é 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);

O que eu coloco para substituir o? Tentativas de conhecimento do Google encontraram muitas dicas que não consegui trabalhar. Qualquer conselho sobre como fazer isso funcionar, especialmente em máquinas antigas (por exemplo, sem framework .net, sem vista) é apreciado.

0
adicionado editado
Visualizações: 2

2 Respostas

Isso funciona, embora a cor de fundo seja preta em vez de transparente.

GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);
0
adicionado
Aparentemente, o Windows está fazendo algo inteligente para o ícone. O ícone original tinha menos transparência do que eu pensava, mas o Windows decidiu adicionar uma transparência estranha. Dito isso, o código acima acaba precisando de um bitmap para ser desenhado usando drawicon entre as duas etapas.
adicionado o autor Brian, fonte

O Vista tem suporte adequado para ícones nos menus, para o pré Vista, você deve usar os itens de menu de desenho do proprietário (MF_OWNERDRAW) se desejar ícones reais de 16x16 cores

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

0
adicionado
Essa solução requer o Windows XP e o framework .net. Eu gostaria de evitar os dois.
adicionado o autor Brian, fonte
Você viu o segundo link, ele tem código funcionando até o win95. O ponto é, qualquer coisa antes do Vista, você realmente precisa fazer o desenho sozinho, então você está livre para escolher se você quer usar GDI, GDI + ou .Net
adicionado o autor Anders, fonte