Windows wählt falsches Symbol von Multi-Icon-Datei und Selbst macht Größe zu korrigieren

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe eine ICO-Datei mit 5 Symbolgrößen eingebettet in es als Hauptanwendungssymbol und das System Tray-Symbol verwendet wird.

Wenn es das Symbol in der Taskleiste zeigt nach oben ist das 16x16-Format, das gewünscht wird. Wenn das Symbol im Infobereich / System-Tray zeigt mich, das 32x32-Format verwendet, und Windows ist es Rendering zu einem 16x16 icon nach unten, das schrecklich aussieht.

Wie kann ich Windows zwingen, die 16x16 Symbolgröße im Infobereich zu benutzen? Hier ist mein Code auf das Symbol in der Taskleiste zu setzen:

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;
War es hilfreich?

Lösung

Beide Antworten sind in der Nähe, aber enthalten eine subtile Gift. Sie sollten nicht die gewünschte Größe als 16x16 codieren.

Stattdessen abfragen SystemInformation.SmallIconSize die entsprechenden Dimensionen zu bestimmen. Obwohl der Standard sicherlich 16x16 ist, könnte dies durch verschiedene Dinge geändert werden, wie DPI-Skalierung.

Siehe die MSDN-Artikel für weitere Informationen über diese Eigenschaft.

Ein Beispiel für die Nutzung sei

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

Andere Tipps

Diese Änderung:

notifyIcon.Icon = this.Icon;

folgt aus:

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

Sie müssen eine neue Instanz des Symbols erstellen. Beim Erstellen (Laden), um die neue Instanz, die Grösse. Die Icon-Klasse Konstruktor hat verschiedene Überlastungen für Sie zur Auswahl. Hier ist, wie Sie es tun können, wenn das Symbol Datei in Ihr Hauptprogramm eingebettet ist (was oft der Fall ist):

Assembly asm = this.GetType().Assembly;

var smallIconSize = new System.Drawing.Size(16, 16);
notifyIcon.Icon = new System.Drawing.Icon(
    asm.GetManifestResourceStream("MyPrettyAppIcon.ico"), smallIconSize);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top