2010-11-26 15 views
6

Necesito mostrar iconos de 16x16 píxeles para error/advertencia/información. Lamentablemente, tanto LoadIcon(0, IDI_*) y LoadImage(0, OIC_*, IMAGE_ICON, 16, 16, LR_SHARED) siempre me dan la versión 32x32 del icono.¿Cómo cargar un ícono de sistema pequeño?

leí sobre ShGetStockIconInfo pero que sólo está disponible de Vista en adelante y todavía tengo que apoyar a XP.

¿Alguna idea?

estoy usando Delphi 2010 con un componente TImage si lo que importa.

+0

¿El ícono que intenta cargar está disponible como 16x16? Si el ícono es solo 32x32, siempre obtienes 32x32. –

+0

estos íconos están disponibles en 16/32/48px –

Respuesta

15

El problema es que cuando lo haces de esta manera se obtiene una versión en caché del icono, el primero que el sistema de carga. Ese será el ícono de gran tamaño, típicamente 32x32. No importa qué tamaño especifiques.

Lo que puede hacer es encontrar el ID del recurso deseado en user32.dll y usar algo como esto:

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

Usted sería mejor llamar GetSystemMetrics(SM_CXSMICON) de hacerse con el tamaño del icono en lugar de código duro 16, pero probablemente ya lo sepas.

no estoy seguro de donde se obtiene el ID de los recursos de los recursos en user32, o incluso si es ninguna garantía de que van a permanecer constante a través de diferentes versiones de Windows. Supongo que lo harán porque se romperán demasiados programas, pero eso es pura conjetura.

+0

¡Gracias por la excelente explicación de por qué no funciona de la manera en que lo hago! –

+5

100: IDI_APPLICATION, 101: IDI_WARNING, 102: IDI_QUESTION, 103: IDI_ERROR, 104: IDI_INFORMATION, 105: IDI_WINLOGO, 106: IDI_SHIELD, usó ResourceHacker para realizar una ingeniería inversa –

+0

Lo tengo trabajando ahora. ¡Aún necesita probar en diferentes versiones de Windows, pero se ve bien hasta ahora! ¡Gracias! –

Cuestiones relacionadas