studio - Windows Forms.NET 2.0: ¿Cómo dibujar un ícono PNG?
librerias para dibujar en c# (3)
ResourceManager
carga el icono en función de los bits almacenados en los recursos. Sin embargo, la forma en que maneja la carga no le permitirá acceder al icono de 256x256 (esta información no llega al System.Drawing.Icon
que está recibiendo).
Lamento decepcionarte, pero la única forma que funciona de la que tengo conocimiento es cargar el ícono a través de una P / LoadImage
de LoadImage
y trabajar con un archivo (sí, lo sé, eso no es lo que estabas buscando). Entonces, la nueva pregunta debería ser: ¿cómo extraigo los bits de un recurso dado para poder almacenarlos en un archivo? Me temo que esto tampoco es posible, después de haber hecho algunos pasos a través de System.Resources.ResourceReader
, ya que los datos de los recursos parecen ser una colección de objetos .NET serializados.
De todos modos, para aquellos que pueden permitirse cargar el ícono desde un archivo .ICO (y para mí, como referencia futura sobre cómo cargar iconos de IconConverter.LoadIcon
), llamen a IconConverter.LoadIcon
:
using System.Runtime.InteropServices;
static class IconConverter
{
public static System.Drawing.Icon LoadIcon(string path, int width, int height)
{
System.IntPtr hIcon;
hIcon = LoadImage (System.IntPtr.Zero, path, IMAGE_ICON, width, height,
LR_LOADFROMFILE);
if (hIcon == System.IntPtr.Zero)
{
return null;
}
return System.Drawing.Icon.FromHandle (hIcon);
}
const int IMAGE_ICON = 1;
const int LR_LOADFROMFILE = 0x0010;
[DllImport ("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern System.IntPtr LoadImage(System.IntPtr hInstance,
string lpszName, uint uType,
int cxDesired, int cyDesired,
uint fuLoad);
}
Una vez que tenga el System.Drawing.Icon
en el tamaño esperado, simplemente píntelo usando graphics.DrawIconUnstretched
. graphics.DrawIconUnstretched
.
Nota: La pregunta Uso del icono de Vista 256 x 256 en la aplicación trata con el uso de un icono de "Vista" como icono de la aplicación. Esta pregunta se refiere a la pintura manual de un icono de Vista.
Nota: Pregunta WinForms .NET 2.0: ¿Cómo pintar el ícono del tamaño correcto? trata de pintar un icono de Vista cargado desde un archivo. Esta pregunta se refiere a pintar un icono de Vista que se carga desde un .resource.
He incluido un ícono en mi proyecto de Visual Studio que tiene varios formatos:
- 16x16
- 32x32
- 48x48
- 256x256 (PNG comprimido)
Ahora quiero dibujar la versión de 256x256. Ninguna de las siguientes cosas que he intentado funcionar.
Lo siguiente dibuja el formato de 32x32 estirado a 256x256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256));
Lo siguiente dibuja el formato 32x32 sin estirar:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256));
Lo siguiente dibuja el formato de 32x32 estirado a 256x256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256));
Lo siguiente dibuja el formato 48x48 estirado a 256x256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(
new Icon(ico, new Size(256, 256)),
new Rectangle(0, 0, 256, 256));
¿Cómo dibujo el icono de formato 256x256?
Notas:
El icono no proviene de un archivo, por lo que PInvoking LoadImage () no ayudará.
El ícono no es el ícono asociado a un archivo, por lo que PInvoking SHGetFileInfo () no ayudará. Tampoco utilizará Icon.ExtractAssociatedIcon .
Tampoco estoy tratando de crear iconos con un formato de 256x256 en tiempo de ejecución, por lo que las bibliotecas diseñadas para hacer eso no ayudarán.
2 : Pregunta WinForms .NET 2.0: ¿Cómo pintar el icono de tamaño adecuado?
Hice una pregunta similar hace un tiempo, pero sin mucha suerte. Algunas de las respuestas en mi publicación pueden ayudarlo, hubo una forma, pero parece bastante difícil. Enlace a mi publicación aquí
Hoy hice una muy buena función para extraer los mapas de bits de 256x256 de los iconos de Vista .
Lo uso para mostrar el icono grande como un mapa de bits en el cuadro "Acerca de".
Esta función toma el objeto Icon como parámetro. Por lo tanto, puede usarlo con cualquier ícono, desde recursos , desde archivos, desde transmisiones, etc. Se ejecuta en cualquier sistema operativo , porque no usa ninguna API Win32, es código 100% administrado :-)
Bitmap ExtractVistaIcon(Icon icoIcon)
Publiqué mi función aquí: ExtractVistaIcon ()