Windows выбирает неправильный значок из файла с несколькими значками и выполняет рендеринг до нужного размера

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

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

Как заставить окна использовать размер значка 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;

person BrianH    schedule 05.03.2009    source источник


Ответы (3)


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

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

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

Пример использования:

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, SystemInformation.SmallIconSize),
person Lem    schedule 03.11.2009

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

notifyIcon.Icon = this.Icon;

к этому:

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, 16, 16);
person BrianH    schedule 05.03.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);
person irobot    schedule 05.03.2009