2009-03-05 2 views
9

J'ai un fichier .ico avec 5 tailles d'icônes incorporées dans celui-ci étant utilisé comme icône d'application principale et l'icône de la barre d'état système.Windows sélectionne une mauvaise icône à partir du fichier multi-icônes et restaure automatiquement la taille correcte

Lorsqu'il apparaît dans la barre des tâches, l'icône utilise le format 16x16 souhaité. Lorsque l'icône apparaît dans la zone de notification/barre d'état système, elle utilise le format 32x32 et Windows affiche une icône 16x16, ce qui est horrible.

Comment forcer Windows à utiliser la taille d'icône 16x16 dans la zone de notification? Voici mon code pour mettre l'icône dans la barre d'état système:

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; 

Répondre

15

Les deux réponses sont proches, mais contiennent un poison subtil. Vous ne devriez pas coder en dur la taille demandée en 16x16.

À la place, interrogez SystemInformation.SmallIconSize pour déterminer les dimensions appropriées. Bien que la valeur par défaut soit certainement 16x16, cela peut être modifié par diverses choses, telles que la mise à l'échelle DPI. Pour plus d'informations sur cette propriété, consultez the MSDN article.

Un exemple d'utilisation serait

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

Vous devez créer une nouvelle instance de l'icône. Lorsque vous créez (chargez) la nouvelle instance, spécifiez la taille. Le constructeur de la classe Icon a plusieurs surcharges différentes à choisir. Voici comment vous pouvez le faire si le fichier icône est intégré dans votre exécutable principal (ce qui est souvent le cas):

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

Modifier ceci:

notifyIcon.Icon = this.Icon; 

à ceci:

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