2010-06-13 12 views
16

En particular, me gustaría poder obtener los iconos pequeños (16 x 16) en tiempo de ejecución.¿Hay alguna manera de obtener diferentes tamaños de iconos del sistema de Windows en .NET?

yo probamos este:

new Icon(SystemIcons.Error, SystemInformation.SmallIconSize) 

que supuestamente "intenta encontrar una versión del icono que corresponda al tamaño solicitado", pero todavía me está dando un icono de 32 x 32. También probé:

Size iconSize = SystemInformation.SmallIconSize; 
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height); 
using (Graphics g = Graphics.FromImage(bitmap)) 
{ 
    g.DrawIcon(SystemIcons.Error, new Rectangle(Point.Empty, iconSize)); 
} 

Pero eso simplemente adapta el icono 32 x 32 hacia abajo en un feo 16 x 16.

he considerado simplemente tirando de los iconos de la biblioteca de imágenes VS, pero realmente quiero para variar dinámicamente con el sistema operativo (iconos de XP en XP, iconos de Vista en Vista, etc.). Estoy dispuesto a P/invocar si eso es lo que se necesita.

Respuesta

6

Terminé P/Invocando. Resulta que tanto LoadIcon como LoadImage muestran el mismo comportamiento (defectuoso, IMO) como SystemIcons. Pero SHGetStockIconInfo, que está disponible en Vista y más tarde, funciona como se esperaba, devolviendo los iconos pequeños, oficiales y diseñados por diseñadores que he estado buscando.

En XP y anteriores, me estoy volviendo a utilizar los iconos pequeños proporcionados en la Biblioteca de imágenes VS.

Si estás pensando en P/Invocar SHGetStockIconInfo, te recomiendo echar un vistazo al Windows API Code Pack para ver cómo.

+1

¿crees que podrías proporcionar una muestra de código para esta solución, incluida la alternativa de Vista? – miroxlav

1

La documentación para esta sobrecarga de constructor dice:

"Inicializa una nueva instancia de la clase Icon y los intentos de encontrar una versión del icono que corresponda al tamaño solicitado

." Si no se puede encontrar una versión que coincida exactamente con el tamaño, se utiliza la coincidencia más cercana. Si el parámetro original es un Icon que tiene un solo tamaño, este método sólo crea un icono duplicado "

creo que este icono tiene solamente un tamaño (32 × 32);. Y el único La forma de obtener diferentes tamaños es escalar este ícono a su tamaño, como en su ejemplo.

+0

Estos iconos definitivamente existen en un tamaño más pequeño. Si no puedo acceder a ellos a través de SystemIcons, está bien, pero me gustaría saber si hay una manera de que funcione. –

+0

Lo siento, podría preguntar, ¿cómo sabes que estos iconos existen en menor tamaño? –

+0

Estos son iconos estándar y tamaños estándar.Puede ver ejemplos de ellos en uso en las Directrices de Windows UX: http://msdn.microsoft.com/en-us/library/aa511277(v=MSDN.10).aspx. –

13

Tiene que escalarlos usted mismo. Los SystemIcons, como descubrió, solo tienen 32x32. Puede escalarlos fácilmente a 16 o 48 según sea necesario. Usa la interpolación para obtener un buen cambio de tamaño bicúbico. Hemos hecho esto muchas veces con éxito para crear un aspecto muy agradable 1 versiones 6x16 y funciona bien tanto si tiene instalado XP o Vista o 7.

Size iconSize = SystemInformation.SmallIconSize; 
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height); 

using (Graphics g = Graphics.FromImage(bitmap)) 
{ 
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
    g.DrawImage(SystemIcons.Error.ToBitmap(), new Rectangle(Point.Empty, iconSize)); 
} 

Icon smallerErrorIcon = Icon.FromHandle(bitmap.GetHicon()); 

Asegúrese de revisar el ejemplo de MSDN here, especialmente a su uso del método DestroyIcon para limpiar el mango cuando haya terminado.

+0

Tienes razón. DrawIcon no parece tener en cuenta el modo de interpolación. Reemplace DrawIcon por DrawBitmap, use SystemIcons.Error.ToBitmap() para transformar su ícono en bmp, y obtendrá un buen resultado. – Maxence

+0

Ahora que ha vuelto a dibujar la imagen del icono en un tamaño más pequeño, ¿cómo se obtiene un objeto 'Icon' del código anterior? – FishBasketGordo

+0

MSDN tiene un buen ejemplo [aquí] (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.gethicon.aspx). Básicamente, llama a 'GetHicon' en el mapa de bits recién creado y luego puedes usar el método estático' Icon.FromHandle'. Preste atención a su uso del método externo 'DestroyIcon'. Trabajar con asas directamente se siente raro en C# y requiere una limpieza adecuada, pero bueno. –

Cuestiones relacionadas