拖动

时间:2016-02-07 21:29:45

标签: winforms .net-4.5 transparency notification-area

我有一个WinForms应用程序,其主要组成部分是通知区域中的一个图标。我注意到,如果我拖动此图标(重新排序,或将其移入/移出Windows隐藏的图标列表),则其透明像素无法正确使用,与其他图标不同。

这在下面的动画中说明;其他图标在拖动时看起来没问题,但是我的图标(红色圆圈)没有(请原谅动画的压缩文物)。

Dragging icons

更仔细地看一下,通常看起来像这样的图标:

Thermostat icon

拖动时看起来像这样:

Thermostat icon being dragged

使用NotifyIcon控件,图标以各种颜色动态生成,并覆盖不同的数字。

为了保持图标边缘的半透明度,PNG format is used(使用CodeProject中的代码示例)获取Bitmap并返回IconNotifyIcon使用:

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 个答案:

没有答案