2008-11-13 27 views
11

Nota: La pregunta Using 256 x 256 Vista icon in application trata sobre el uso del icono de "Vista" como icono de la aplicación. Esta pregunta se refiere a la pintura manual de un icono de Vista.Windows Forms .NET 2.0: ¿Cómo dibujar un icono PNG?

Nota: La pregunta WinForms .NET 2.0: How to paint the proper sized icon? trata sobre cómo 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 icono 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.

A continuación se dibuja el formato 32x32 estirado hasta 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256)); 

A continuación se extrae el formato 32x32 sin estirar:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256)); 

A continuación se extrae el formato 32x32 estiró a 256x256 :

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256)); 

A continuación se dibuja el formato 48x48 estirado hasta 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIcon(
     new Icon(ico, new Size(256, 256)), 
     new Rectangle(0, 0, 256, 256)); 

¿Cómo dibujar el icono de 256x256 formato?


Notas:

  1. El icono no está viniendo de un archivo, por lo PInvoking LoadImage() no ayudará.

  2. El ícono no es el ícono asociado con un archivo, entonces PInvoking SHGetFileInfo() will no ayuda. Tampoco lo hará using Icon.ExtractAssociatedIcon.

  3. Tampoco estoy tratando de crear iconos con un formato de 256x256 en tiempo de ejecución, por lo que libraries designed to do that no será de ayuda.

    2: Pregunta WinForms .NET 2.0: How to paint the proper sized icon?

+0

reabierto - el 'duplicado 'thread no tiene una respuesta aceptada/correcta para esta pregunta específica –

+0

Es una pregunta diferente. Eso se trata de usar un icono de Vista como icono de la aplicación. Esto se trata de dibujar un ícono de Vista en una Gráfica. –

+0

Puede pegar (slexy.org funciona) una muestra de 256^2 archivo PNG icono resx para que pueda piratear esto (o dígame cómo hacer uno fácilmente) – TheSoftwareJedi

Respuesta

0

me hizo una pregunta similar hace un tiempo, pero no con 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 here

+0

Las respuestas se utilizan para extraer el icono asociado de un archivo; que solo te daría un ícono de vista si estuvieras en vista. También requiere que obtenga el icono de un archivo. Este es un icono que he escrito. –

3

El ResourceManager carga el ícono basado en 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 decepcionarlo, pero la única forma que funciona de la que soy consciente es cargar el icono a través de una P/Invocación de LoadImage y trabajar con un archivo (sí, lo sé, eso no es lo que era 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 recorrido un poco el 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 el lujo de cargar el icono de un archivo ICO (y por mí mismo, como una futura referencia sobre cómo cargar los iconos de 256x256), llame 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.

0

Hoy he hecho una muy buena función para extrayendo los 256x256 mapas de bits 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 los recursos, desde archivos, desde transmisiones, etc. Se ejecuta en cualquier sistema operativo , porque hace no usar cualquier API de Win32, es 100% código administrado :-)

Bitmap ExtractVistaIcon(Icon icoIcon) 

he publicado mi función aquí: ExtractVistaIcon()

Cuestiones relacionadas