2009-03-05 12 views
9

Tengo un archivo .ico con 5 tamaños de icono incrustado en él que se utiliza como icono de la aplicación principal y el icono de la bandeja del sistema.Windows elige el icono incorrecto del archivo de varios iconos y auto renderiza el tamaño correcto

Cuando aparece en la barra de tareas, el icono está utilizando el formato 16x16 que se desea. Cuando aparece el ícono en el área de notificación/bandeja del sistema, está usando el formato 32x32 y Windows lo está reduciendo a un icono de 16x16, que se ve horrible.

¿Cómo obligo a Windows a utilizar el tamaño del icono de 16x16 en el área de notificación? Aquí está mi código para poner el icono en la bandeja del sistema:

ContextMenu cmNotify = new ContextMenu(); 
MenuItem miNotify = new MenuItem(Properties.Resources.Notify_Text); 
miNotify.DefaultItem = true; 
miNotify.Click += new EventHandler(notifyHandler); 
cmNotify.MenuItems.Add(miNotify); 


notifyIcon = new NotifyIcon(); 
notifyIcon.Icon = this.Icon; 
notifyIcon.Visible = true; 
notifyIcon.ContextMenu = cmNotify; 
notifyIcon.Text = AppConstants.APPLICATION_NAME; 

Respuesta

15

Ambas respuestas están cerca, pero contienen un veneno sutil. No debe codificar el tamaño solicitado como 16x16.

En su lugar, consulte SystemInformation.SmallIconSize para determinar las dimensiones adecuadas. Aunque el valor predeterminado es sin duda 16x16, esto podría cambiarse por varias cosas, como la escala de PPP.

Ver the MSDN article para más información sobre esta propiedad.

Un ejemplo de uso sería

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, SystemInformation.SmallIconSize), 
1

Es necesario crear una nueva instancia del icono. Al crear (cargar) la nueva instancia, especifique el tamaño. El constructor de la clase Icon tiene varias sobrecargas diferentes para que usted elija. He aquí cómo usted puede hacerlo si el archivo de icono se incrusta en su ejecutable principal (que es a menudo el caso):

Assembly asm = this.GetType().Assembly; 

var smallIconSize = new System.Drawing.Size(16, 16); 
notifyIcon.Icon = new System.Drawing.Icon(
    asm.GetManifestResourceStream("MyPrettyAppIcon.ico"), smallIconSize); 
7

cambiar esta situación:

notifyIcon.Icon = this.Icon; 

a esto:

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, 16, 16); 
Cuestiones relacionadas