2010-11-26 18 views
6

Ich muss 16x16 Pixel Symbole für Fehler/Warnung/Informationen anzeigen. Leider geben mir sowohl LoadIcon(0, IDI_*) als auch LoadImage(0, OIC_*, IMAGE_ICON, 16, 16, LR_SHARED) immer die 32x32 Version des Icons.Wie lade ich ein kleines Systemicon?

Ich lese über ShGetStockIconInfo, aber das ist nur ab Vista verfügbar und ich muss noch XP unterstützen.

Irgendwelche Ideen?

Ich verwende Delphi 2010 mit einer TImage Komponente, wenn das wichtig ist.

+0

Ist das Symbol, das Sie laden möchten, als 16x16 verfügbar? Wenn das Symbol nur 32x32 ist, erhalten Sie immer 32x32. –

+0

diese Symbole sind in 16/32/48px –

Antwort

15

Das Problem ist, dass wenn Sie es auf diese Weise tun, Sie eine zwischengespeicherte Version des Symbols erhalten, die erste, die das System geladen. Das wird das große Symbol, typischerweise 32x32. Es spielt keine Rolle, welche Größe Sie angeben.

Was können Sie tun, ist die ID der gewünschten Ressource in user32.dll zu finden und so etwas wie folgt verwenden:

LoadImage(GetModuleHandle('user32'), MAKEINTRESOURCE(103), IMAGE_ICON, 
    16, 16, LR_DEFAULTCOLOR); 

Sie wäre besser GetSystemMetrics(SM_CXSMICON) zu nennen halten, die Symbolgröße zu erhalten, anstatt zu hard code 16, aber das weißt du wahrscheinlich schon.

Ich bin nicht sicher, woher Sie die Ressourcen-IDs für die Ressourcen in user32 erhalten, oder sogar, wenn sie eine Garantie dafür sind, dass sie in verschiedenen Windows-Versionen konstant bleiben. Meine Vermutung ist, dass sie es tun werden, weil zu viele Programme kaputt gehen würden, aber das ist nur pures Raten.

+0

Dank für die hervorragende Erklärung, warum es nicht funktioniert, wie ich es mache! –

+5

100: IDI_APPLICATION, 101: IDI_WARNING, 102: IDI_QUESTION, 103: IDI_ERROR, 104: IDI_INFORMATION, 105: IDI_WINLOGO, 106: IDI_SHIELD, benutzter ResourceHacker zum Reverse Engineering –

+0

Es funktioniert jetzt. Immer noch auf verschiedenen Windows-Versionen testen, aber bisher gut aussehen! Vielen Dank! –