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

Ich experimentiere mit dem Hinzufügen von Symbolen zu einer Shell-Erweiterung. Ich habe diesen Code (saniert für einfaches Lesen), der funktioniert:

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

Der nächste Schritt ist dieser Code:

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

Was setze ich ein, um die? Zu ersetzen? Versuche, dieses Wissen zu googeln, haben viele Tipps gefunden, die ich nicht funktionierte. Jeder Ratschlag, um dies zum Laufen zu bringen, insbesondere auf älteren Maschinen (z. B. kein .net-Framework, keine Vista) wird geschätzt.

0

2 Antworten

Dies funktioniert, obwohl die Rückseite schwarz statt transparent ist.

GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);
0
hinzugefügt
Anscheinend macht Windows der Ikone etwas schlaues. Das Originalsymbol hatte weniger Transparenz als ich dachte, aber Windows entschied sich dafür, seltsame Transparenz hinzuzufügen. Das heißt, der obige Code benötigt am Ende eine Bitmap, die mit Drawicon zwischen den beiden Schritten gezeichnet wird.
hinzugefügt der Autor Brian, Quelle

Vista hat die richtige Unterstützung für Symbole in Menüs, für Pre Vista müssen Sie Elemente des Benutzer-Draw-Menüs (MF_OWNERDRAW) verwenden, wenn Sie echte 16x16-Vollfarben-Icons wünschen

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

0
hinzugefügt
Diese Lösung benötigt Windows XP und das .net-Framework. Ich möchte beides vermeiden.
hinzugefügt der Autor Brian, Quelle
Haben Sie sich den 2. Link angeschaut? Der Code funktioniert bis auf win95. Der Punkt ist, alles vor Vista, Sie müssen wirklich die Zeichnung selbst tun, so dass Sie frei entscheiden können, ob Sie GDI, GDI + oder .Net verwenden möchten
hinzugefügt der Autor Anders, Quelle