Проблемы с прозрачностью значков уведомлений при перетаскивании
У меня есть приложение WinForms, основным компонентом которого является значок в области уведомлений. Я заметил, что если я перетаскиваю этот значок (чтобы изменить его порядок или переместить в / из списка значков, которые скрыты в Windows), то его прозрачные пиксели не будут правильно соблюдаться, в отличие от других значков.
Это показано на анимации ниже; другие значки выглядят нормально при перетаскивании, но моя иконка (красный круг) - нет (извините за артефакты сжатия анимации).
Если взглянуть на это более внимательно, то значок, который обычно выглядит так:
Выглядит вот так при перетаскивании:
NotifyIcon
используется элемент управления, и значок генерируется динамически в различных цветах и с разными номерами.
Чтобы обеспечить прозрачность по краям значка, используется формат PNG (с использованием примера кода из CodeProject) для Bitmap
и вернуть Icon
который используется NotifyIcon
:
private static readonly byte[] _pngIconHeader = { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
using (var bmp = new Bitmap(image, new Size(image.Width, image.Height)))
{
byte[] png;
using (var ms = new MemoryStream())
{
bmp.Save(ms, ImageFormat.Png);
ms.Position = 0;
png = ms.ToArray();
}
using (var ms = new MemoryStream())
{
_pngIconHeader[6] = (byte)image.Width;
_pngIconHeader[7] = (byte)image.Height;
_pngIconHeader[14] = (byte)(png.Length & 255);
_pngIconHeader[15] = (byte)(png.Length / 256);
_pngIconHeader[18] = (byte)(_pngIconHeader.Length);
ms.Write(_pngIconHeader, 0, _pngIconHeader.Length);
ms.Write(png, 0, png.Length);
ms.Position = 0;
return new Icon(ms);
}
}
Есть ли еще что-то, что нужно сделать, чтобы Windows правильно относилась к этому во время перетаскивания?