Windows choisit une mauvaise icône dans un fichier multi-icônes et se règle automatiquement à la taille correcte
Question
J'ai un fichier .ico avec 5 tailles d'icônes intégrées, utilisé comme icône principale de l'application et icône de la barre d'état système.
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 l'a convertie en une icône 16x16, qui a l'air horrible.
Comment forcer Windows à utiliser la taille de l'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;
La solution
Les deux réponses sont proches mais contiennent un poison subtil. Vous ne devez pas coder en dur la taille demandée en 16x16.
A la place, interrogez SystemInformation.SmallIconSize pour déterminer les dimensions appropriées. Bien que la valeur par défaut soit certainement 16x16, cela pourrait être modifié par diverses choses, telles que la mise à l'échelle DPI.
Voir la Article MSDN pour plus d'informations sur cette propriété.
Un exemple d'utilisation serait
notifyIcon.Icon = new System.Drawing.Icon(this.Icon, SystemInformation.SmallIconSize),
Autres conseils
Modifiez ceci:
notifyIcon.Icon = this.Icon;
à ceci:
notifyIcon.Icon = new System.Drawing.Icon(this.Icon, 16, 16);
Vous devez créer une nouvelle instance de l'icône. Lors de la création (du chargement) de la nouvelle instance, spécifiez la taille. Le constructeur de la classe Icon propose différentes surcharges. Voici comment procéder si le fichier d’icône est intégré à 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);