Windows sceglie un'icona errata da un file con più icone e esegue il rendering automatico delle dimensioni corrette

StackOverflow https://stackoverflow.com/questions/616500

  •  03-07-2019
  •  | 
  •  

Domanda

Ho un file .ico con 5 dimensioni icona incorporate in esso utilizzato come icona dell'applicazione principale e icona sulla barra delle applicazioni.

Quando appare nella barra delle applicazioni l'icona sta usando il formato 16x16 che è desiderato. Quando l'icona appare nell'area di notifica / nella barra delle applicazioni, sta usando il formato 32x32 e Windows lo sta trasformando in un'icona 16x16, che sembra orribile.

Come posso forzare Windows a utilizzare le dimensioni dell'icona 16x16 nell'area di notifica? Ecco il mio codice per 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;
È stato utile?

Soluzione

Entrambe le risposte sono vicine, ma contengono un sottile veleno. Non è necessario codificare la dimensione richiesta come 16x16.

Invece, interroga 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.

Vedi the Articolo MSDN per ulteriori informazioni su questa proprietà.

Un esempio di utilizzo sarebbe

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

Altri suggerimenti

Cambia questo:

notifyIcon.Icon = this.Icon;

a questo:

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

Devi creare una nuova istanza dell'icona. Quando si crea (si carica) la nuova istanza, specificare la dimensione. Il costruttore della classe Icon ha diversi sovraccarichi tra cui scegliere. Ecco come puoi farlo se il file icona è incorporato nel tuo 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top