Windows choisit une mauvaise icône dans un fichier multi-icônes et se règle automatiquement à la taille correcte

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

  •  03-07-2019
  •  | 
  •  

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;
Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top