我有一个WinForms应用程序,其主要组成部分是通知区域中的一个图标。我注意到,如果我拖动此图标(重新排序,或将其移入/移出Windows隐藏的图标列表),则其透明像素无法正确使用,与其他图标不同。
这在下面的动画中说明;其他图标在拖动时看起来没问题,但是我的图标(红色圆圈)没有(请原谅动画的压缩文物)。
更仔细地看一下,通常看起来像这样的图标:
拖动时看起来像这样:
使用NotifyIcon
控件,图标以各种颜色动态生成,并覆盖不同的数字。
为了保持图标边缘的半透明度,PNG format is used(使用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在被拖动时正确处理?