2009-03-05 3 views
9

Ich habe eine .ico-Datei mit 5 eingebetteten Symbolgrößen, die als Hauptanwendungssymbol und System Tray-Symbol verwendet wird.Windows wählt falsches Symbol aus der Multi-Icon-Datei und rendert sich selbst auf die richtige Größe

Wenn es in der Taskleiste angezeigt wird, verwendet das Symbol das 16x16-Format, das gewünscht wird. Wenn das Symbol im Infobereich/in der Taskleiste angezeigt wird, verwendet es das 32x32-Format und Windows rendert es auf ein 16x16-Symbol herunter, das schrecklich aussieht.

Wie erzwinge ich Windows, die Symbolgröße 16 x 16 im Infobereich zu verwenden? 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; 

Antwort

15

Beide Antworten sind nahe, enthalten aber ein subtiles Gift. Sie sollten die angeforderte Größe nicht als 16x16 fest codieren.

Fragen Sie stattdessen SystemInformation.SmallIconSize, um die entsprechenden Dimensionen zu ermitteln. Obwohl die Standardeinstellung 16x16 ist, könnte dies durch verschiedene Dinge wie die DPI-Skalierung geändert werden.

Weitere Informationen zu dieser Eigenschaft finden Sie unter 10.

Ein Beispiel für die Nutzung wäre

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

Sie benötigen eine neue Instanz des Symbols zu erstellen. Geben Sie beim Erstellen (Laden) der neuen Instanz die Größe an. Der Icon-Klassenkonstruktor hat mehrere verschiedene Überladungen, aus denen Sie auswählen können. 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); 
7

ändert diese:

notifyIcon.Icon = this.Icon; 

dazu:

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