Проблемы с прозрачностью значков уведомлений при перетаскивании

У меня есть приложение 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 правильно относилась к этому во время перетаскивания?

0 ответов

Другие вопросы по тегам