Есть ли способ получить различные размеры системных значков Windows в .NET? - PullRequest
17 голосов
/ 13 июня 2010

В частности, я хотел бы иметь возможность получать маленькие (16 х 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, если это то, что нужно.

Ответы [ 3 ]

13 голосов
/ 16 июня 2010

Вы должны масштабировать их самостоятельно.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 для очистки ручки, когда вы закончите.

6 голосов
/ 28 июня 2010

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

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

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

1 голос
/ 13 июня 2010

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

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

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

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

...