Иконки в искаженном системном трее - PullRequest
2 голосов
/ 26 февраля 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 26 февраля 2010

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

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

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

1 голос
/ 20 апреля 2011

Я также вижу искаженные значки в системном трее, и я проследил проблему до настройки 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».

1 голос
/ 26 февраля 2010

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

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

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

...