2009-03-05 16 views
9

Ho un file .ico con 5 dimensioni di icone incorporate in esso utilizzato come icona principale dell'applicazione e l'icona nell'area di notifica.Windows sceglie l'icona errata dal file multi-icona e il rendering automatico per correggere la dimensione

Quando si visualizza nella barra delle applicazioni, l'icona utilizza il formato 16x16 che si desidera. Quando l'icona viene visualizzata nell'area di notifica/barra delle applicazioni, utilizza il formato 32x32 e Windows la riduce ad un'icona 16x16, che sembra orribile.

Come impongo alle finestre di utilizzare la dimensione dell'icona 16x16 nell'area di notifica? Ecco il mio codice di mettere l'icona nella barra delle applicazioni:

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; 

risposta

15

Entrambe le risposte sono vicine, ma contengono un veleno sottile. Non si deve eseguire l'hardcode della dimensione richiesta come 16x16.

Invece, interrogare SystemInformation.SmallIconSize per determinare le dimensioni appropriate. Sebbene il valore predefinito sia sicuramente 16x16, questo potrebbe essere modificato da varie cose, come il ridimensionamento DPI.

Vedere the MSDN article per ulteriori informazioni su questa proprietà.

Un esempio di utilizzo potrebbe essere

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

È necessario creare una nuova istanza dell'icona. Quando si crea (carica) la nuova istanza, specificare la dimensione. Il costruttore della classe Icon ha diversi sovraccarichi tra cui scegliere. Ecco come si può fare se il file icona è incorporato nel vostro eseguibile principale (che è spesso il 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

Modifica questo:

notifyIcon.Icon = this.Icon; 

a questo:

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