Подтвердить что ты не робот

Есть ли способ получить различные размеры значков системы Windows в .NET?

В частности, я хотел бы получить маленькие значки (16 x 16) во время выполнения.

Я пробовал это:

new Icon(SystemIcons.Error, SystemInformation.SmallIconSize)

Что якобы "пытается найти версию значка, которая соответствует запрашиваемому размеру", но она все равно дает мне значок 32 x 32. Я также пробовал:

Size iconSize = SystemInformation.SmallIconSize;
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
    g.DrawIcon(SystemIcons.Error, new Rectangle(Point.Empty, iconSize));
}

Но это просто масштабирует значок 32 x 32 до уродливого 16 x 16.

Я рассмотрел просто вытаскивание значков из библиотеки изображений VS, но я действительно хочу, чтобы они динамически менялись с ОС (значки XP на значках XP, Vista на Vista и т.д.). Я готов P/Invoke, если это нужно.

4b9b3361

Ответ 1

Я закончил P/Invoking. Оказывается, что LoadIcon и LoadImage демонстрируют то же самое ( ошибочное, IMO) поведение SystemIcons. Но SHGetStockIconInfo, который доступен в Vista и позже, работает так, как ожидалось, возвращая небольшие официальные дизайнерские иконки, которые я искал для.

В XP и ранее я возвращаюсь к использованию небольших значков, представленных в библиотеке изображений VS.

Если вы думаете о P/Invoking SHGetStockIconInfo самостоятельно, я рекомендую взглянуть на Код кода Windows API, чтобы узнать, как.

Ответ 2

Вы должны масштабировать их самостоятельно. SystemIcons, как вы выяснили, имеет только 32x32. Вы можете легко масштабировать их до 16 или 48 по мере необходимости. Используйте интерполяцию, чтобы получить хороший бикубический размер. Мы сделали это много раз, чтобы создать очень красивые 16x16-версии, и он отлично работает, будь то XP или Vista или 7.

Size iconSize = SystemInformation.SmallIconSize;
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height);

using (Graphics g = Graphics.FromImage(bitmap))   
{
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.DrawImage(SystemIcons.Error.ToBitmap(), new Rectangle(Point.Empty, iconSize));   
}

Icon smallerErrorIcon = Icon.FromHandle(bitmap.GetHicon());

Обязательно ознакомьтесь с примером MSDN здесь, особенно с использованием метода DestroyIcon для очистки дескриптора, когда вы сделал.

Ответ 3

Документация для этой перегрузки конструктора говорит:

"Инициализирует новый экземпляр класса Icon и пытается найти версию значка, которая соответствует запрашиваемому размеру.

" Если не удается найти версию, которая точно соответствует размеру, используется самое близкое совпадение. Если параметр original является Icon с единственным размером, этот метод создает только дубликат значка. "

Я думаю, что этот значок имеет только один размер (32 и раз; 32); и единственный способ получить разные размеры - это масштабирование этого значка до вашего размера, как в вашем примере.