2008-09-30 21 views
31

Esta fue una pregunta de la entrevista. Dado Visual Studio 2008 y un icono guardado como un archivo .PNG, requerían la imagen como un recurso incrustado y para ser utilizado como el icono dentro de la barra de título de un formulario.Tengo un archivo .PNG. ¿Desea que el icono embebido se muestre como icono en la barra de título del formulario?

Estoy buscando lo que habría sido la respuesta modelo a esta pregunta, el código (de trabajo) y cualquier trucos de Visual Studio. (La respuesta del modelo es una que me debería dar el trabajo si la encuentro la próxima vez.)

Específicamente, no sé cómo cargar la imagen una vez que es un recurso incrustado ni cómo obtenerlo como el icono para la barra de título.

Como solución parcial, ignorando el bit incorporado, he copiado el recurso al directorio ouput y trató lo siguiente: -

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.Icon = new Icon("Resources\\IconImage.png"); 
    } 
} 

Este falló con el 'cuadro' error "argumento debe ser una imagen que se puede utilizar como un icono ".

Supongo que el archivo .PNG en realidad necesitaba ser .ICO, pero no pude ver cómo realizar la conversión. ¿Es correcta esta presunción o hay un problema diferente?

Respuesta

57

Encienda VS, inicie la nueva aplicación de Windows. Abra la hoja de propiedades, agregue el archivo .png como un recurso (en este ejemplo: glider.png). A partir de aquí, se puede acceder al recurso como un archivo de mapa de bits como WindowsFormsApplication10.Properties.Resources.glider

Código para usarlo como un icono de aplicación:

public Form1() 
     { 
      InitializeComponent(); 
      Bitmap bmp = WindowsFormsApplication10.Properties.Resources.glider; 
      this.Icon = Icon.FromHandle(bmp.GetHicon()); 
     } 
+1

Tenía que hacer un espacio de nombre completo System.Drawing.Icon.FromHandle (pero funciona muy bien gracias –

1

Un buen recurso sobre el tema en C# 2.0 Convert Bitmap to Icon.

+0

agradable rutina para convertir una imagen a un icono. En mi caso, la imagen tenía las dimensiones correctas para un ícono, por lo que tal vez sea posible una simplificación. También no tengo una forma de llegar a la imagen incrustada. –

25

La respuesta modelo para esa pregunta sería:

System.Console.WriteLine("Are you serious?"); 
System.Console.WriteLine("I think I will try my chances with another employer."); 

Ese es el tipo de cosa que podría resolver en frente de su equipo en pocos minutos utilizando recursos como Google y desbordamiento de la pila, la solución de una tarea como ésta da poca información sobre si usted es un buen desarrollador o no.

Icon.FromHandle causará problemas con un PNG, porque los PNG tienen más de un bit de transparencia. Este tipo de problema se puede resolver con una biblioteca como this one.

Las posibilidades son que no sabían cómo hacerlo y estaban tratando de exprimir la respuesta de los empleados potenciales. Además, establecer el ícono de la forma de un PNG es un golpe de rendimiento inesperado, debería haber sido un ICO en primer lugar.

+7

"Icon.FromHandle causará problemas con un PNG, porque los PNG tienen más de un bit de transparencia". Demostrar que este conocimiento ofrecería información valiosa para un entrevistador que el desarrollador probablemente haya tratado con aplicaciones del mundo real y problemas de aplicación de envío. –

+1

Buena respuesta. Recordaré esta respuesta en caso de que me pregunten tontas en las entrevistas. – Bitterblue

+0

@ Icon.FromHandle "causará problemas con un PNG "- ¿qué tipo de problemas? – user626528

16

entra aquí:

http://www.getpaint.net/ (gratis)

Y aquí:

Paint.NET ico Plugin (gratis)

Instalar Paint.NET. Coloque el complemento ico (segundo enlace) en la carpeta Paint.NET \ FileTypes. Inicie Paint.NET. Abra su .png y guárdelo como .ico.

Gratis y fácil.

+1

Segundo enlace está muerto = ( – IbrarMumtaz

+0

Secon d link: http://www.evanolds.com/pdn.html – IbrarMumtaz

+0

Aunque esta no es la respuesta modelo, ¡ciertamente es un conjunto de enlaces ** muy ** útil! – ThunderGr

0

Esto funcionó para mis propósitos, ya que todos mis recursos eran archivos PNG:

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = CharSet.Auto)] 
extern static bool DestroyIcon(IntPtr handle); 

// From http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.gethicon.aspx 
private Icon bitmapToIcon(Bitmap myBitmap) 
{ 
    // Get an Hicon for myBitmap. 
    IntPtr Hicon = myBitmap.GetHicon(); 

    // Create a new icon from the handle. 
    Icon newIcon = Icon.FromHandle(Hicon); 

    return newIcon; 
} 
+0

Usted declaró, pero no llamó, 'DestroyIcon (Hicon);' Será necesario llamarlo en algún momento. El código que cites recomienda copiar el ícono, luego llamar a 'DestroyHandle (newIcon.Handle);' –

+0

Buena captura. Estás en lo correcto. Gracias. –

Cuestiones relacionadas