.Net ToolStrip и ImageList - неправильный размер изображения - PullRequest
1 голос
/ 18 февраля 2011

У меня есть значок, который содержит 32-битные изображения размером 16x16, 24x24 и 32x32.Я создаю три объекта ImageList, которые содержат изображения трех разных размеров, и назначаю свойство ImageList в моей ToolStrip, учитывая, какой размер выбирает пользователь.Однако изображения, отображаемые в объектах ToolStrip, являются масштабированными версиями изображения 32x32.Я не могу понять, почему, например, когда я создаю 16x16 ImageList, он не извлекает изображение 16x16 из значка.Мой код в основном выглядит следующим образом:

ImageList m_imageList16 = new ImageList();
m_imageList16.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
m_imageList16.ImageSize = new System.Drawing.Size(16, 16);
m_imageList16.TransparentColor = System.Drawing.Color.Transparent;

// Open is an icon in my resources that contains various sizes of images. 
m_imageList16 .Images.Add(global::MyTestApp.Properties.Resources.Open);

// Later when the user selects the 16 size from a menu, I change the toolbar:
m_toolbar.ImageScalingSize = new Size(16, 16);
m_toolbar.ImageList = m_imageList16;

Кажется, что это просто берет изображение размера 32x32 в моей иконке и уменьшает его до 16x16, вместо использования изображения 16x16, определенного в иконке.Может кто-нибудь помочь с этим?Заранее спасибо за любой вклад!

  • Стив

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Я не могу найти никаких доказательств в поддержку моей теории, но, похоже, ImageList не знает о выборе значков разных размеров.Я догадываюсь, что он просто преобразует значки в растровые изображения и сохраняет эти данные.

На форумах MSDN я нашел этот фрагмент от пользователя MVP nobugz:

Iдумаю, я могу воспроизвести вашу проблему.Когда я использую MicroAngelo (утилита редактирования значков), чтобы извлечь значок № 5 из shell32.dll, сохранить его на диск, а затем добавить значок в 16x16 ImageList, я вижу плохо интерполированную версию значка.Когда я редактирую значок и удаляю все форматы, кроме 16x16x256 цветов, я получаю красивую четкую версию значка.

Похоже, ImageList недостаточно умен, чтобы выбрать значок, который лучше всего соответствует изображению из Списка изображений.Свойство ImageSize и ColorDepth.Это никогда не было особенно умным управлением.Это не совсем соответствует вашему сценарию, но результат тот же.Вид физического размера 32x32 намекает на то, что что-то пошло не так, когда вы извлекли значок.Я вижу 16x16 на отредактированном значке, но 32x32 на неотредактированном значке.

Кроме того, эта страница из CSharpKey показалась полезным ресурсом, работающим со списками изображений и значками.Вот выдержка:

Если вы создаете список значков, вы можете создать каждый из них с размером по умолчанию 16x16.В некоторых случаях (например, , если вы намереваетесь использовать изображения для представления списка ), вы можете создать или создать второй набор значков размером 32x32 (и / или 48x48).) каждый.

Кажется, что "чтение между строк", что ImageList просто хранит один размер и возвращает версии сохраненного изображения с передискретизацией.

Редактировать

Я нашел еще одну ссылку на CodeProject ( Встраивание иконок в ваше приложение VB.NET ), где говорится:

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

0 голосов
/ 09 февраля 2014

Я подал эту ошибку еще в 2006 году, и ребята из Microsoft ответили, что они могут воспроизвести проблему, но это не критично, и они не собираются ее исправить.

Iтеперь я использую соответствующие png вместо значков большого размера.

...