2010-02-25 1 views
2

Я написал небольшое приложение для системного лотка, которое использует NotifyIcon для отображения состояния процесса. Я загружая высокого качества 64 на 64 PNG отформатированного icon следующим образом:Иконки искаженных системных лотков

Bitmap rawImage = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("Snitch.Icons.Loading.png")); 
m_icon.Icon = Icon.FromHandle(rawImage.GetHicon()); 

Однако значок, который появляется в системном трее никогда не выглядит так же хорошо, как мой значок источника, является ли установка или что-то я пропал? Я пробовал 16x16, 32x32 восьмибитных файлов значков, созданных VS2008, но они кажутся не лучшими.

+0

Я слышал, что правильным термином для «системного лотка» является «Windows Notification Area». Тем не менее. – zneak

+0

Возможно, вы должны изменить размер значка с помощью программного обеспечения для редактирования изображений, которое использует лучший алгоритм интерполяции. Или даже лучше использовать специально разработанную иконку 16x16. –

+0

Я пробовал 16x16, они, похоже, тоже странно искажены. Я должен упомянуть об этом VS2008 на Windows 7 Enterprise. – Danielb

ответ

1

Учитывайте качество миниатюр относительно полноразмерной фотографии; теперь представьте, что вы сократите всю фотографию до 16x16 пикселей. Чем больше расхождение между исходным размером и новым размером, тем хуже будет выглядеть результат, независимо от того, сжимаетесь ли вы или растягиваетесь.

Лучшее, что можно сделать, если вы можете, получить или создать файл .ico, который фактически содержит отдельные значки 16x16, 32x32, 48x48 и 64x64. Следующее, что лучше всего, возможно, будет использовать простой значок 16x16 для области уведомлений. Любое изменение размера/повторная выборка будет искажаться.

В Интернете есть несколько сайтов с бесплатной или недорогой загрузкой значков нескольких размеров или 16x16. Здесь уже есть несколько вопросов по where to find icons, поэтому я не стану пытаться начинать листинг сайтов самостоятельно.

+0

Я уже пробовал маленькие значки (хотя я их рисовал), они все еще казались странными артефактами, например. цветной круг на прозрачном фоне каким-то образом приобрел частичный черный контур. – Danielb

+0

@ Danielb: Для этого мне нужно будет увидеть пример, я не могу сказать, что я испытал это особое поведение. – Aaronaught

2

Если добавить элемент управления NotifyIcon к объекту Form вашего приложения, то приложение будет отображать значок в трее области панели задач. оказывается размером значка уведомления является же, как и для блока управления и Taskbar иконок: 16x16 пикселей, потенциально вытянутых для размещения высоты системного лотка, который зависит от высоты задач. Однако, как ни странно, Windows не использует растровое изображение 16x16x256 для этого случая ; он использует 32x32x256 bitmap по умолчанию и выдает его до нужного размера. Я думаю, что не имеет особого основания для эта разница - с помощью 32x32 версии для значка уведомлений, но 16x16 для панели задач и блока управления - но там это.

http://www.hhhh.org/cloister/csharp/icons/

Примечание - статья из с. 2003

+0

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

1

Я также вижу искаженные значки в системном трее, и я проследил проблему с настройкой Win DPI. В моем случае это 115 вместо 100. Когда показано в системном лотке, значок 16x16 фактически отображается как 18x18. Число исходит из этого уравнения:

iconSize= (int) (16* (115/100))= int (18.4) = 18 

значок 18x18 выглядит некрасиво, потому что Win берет иконку 16x16 и «клонов» несколько пиксельных строк и столбцов, чтобы соответствовать новому размеру. Я попытался предоставить Win с пользовательским значком 18x18, но Win не будет показывать его на панели задач как есть. Он будет сначала заставляет растровое изображение значков до ближайшего размера 2-го размера (16x16) и , затем растягивает его до 18x18 для отображения пиксельным клонированием (с ожидаемыми артефактами). Помимо изменения вашего DPI, я не вижу обходных решений, потому что мы не контролируем принудительный промежуточный шаг «power-of-2».

+0

Спасибо, что указали, откуда эта проблема. –