Windows выбирает неправильный значок из файла с несколькими значками и автоматически отображает нужный размер - PullRequest
9 голосов
/ 05 марта 2009

У меня есть файл .ico со встроенными в него иконками 5 размеров, который используется как значок основного приложения и значок на панели задач.

Когда это появляется в панели задач, значок использует желаемый формат 16x16. Когда значок появляется в области уведомлений / на панели задач, он использует формат 32x32, а Windows отображает его до значка 16x16, что выглядит ужасно.

Как заставить Windows использовать значок размером 16x16 в области уведомлений? Вот мой код для размещения иконки в системном трее:

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;

Ответы [ 3 ]

15 голосов
/ 04 ноября 2009

Оба ответа близки, но содержат тонкий яд. Вы не должны жестко кодировать запрошенный размер как 16x16.

Вместо этого запросите SystemInformation.SmallIconSize, чтобы определить соответствующие измерения. Хотя по умолчанию установлено значение 16x16, это может быть изменено различными способами, например масштабированием DPI.

См. статью MSDN для получения дополнительной информации об этом свойстве.

Примером использования будет

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, SystemInformation.SmallIconSize),
7 голосов
/ 06 марта 2009

Изменить это:

notifyIcon.Icon = this.Icon;

к этому:

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, 16, 16);
1 голос
/ 06 марта 2009

Вам необходимо создать новый экземпляр иконки. При создании (загрузке) нового экземпляра укажите размер. Конструктор класса Icon имеет несколько различных перегрузок для выбора. Вот как это можно сделать, если файл значков встроен в ваш основной исполняемый файл (что часто бывает):

Assembly asm = this.GetType().Assembly;

var smallIconSize = new System.Drawing.Size(16, 16);
notifyIcon.Icon = new System.Drawing.Icon(
    asm.GetManifestResourceStream("MyPrettyAppIcon.ico"), smallIconSize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...