一旦图像在系统托盘中结束,notifyicon图像看起来很糟糕

时间:2011-09-20 19:50:57

标签: c# .net image icons notifyicon

我在Windows 7上使用Visual Studio 2010,C#。

我在项目中添加了一个通知控件,并将其设置为我导入项目的图标。如果我只是预览它,图标图像真的很好看,但是一旦我运行我的代码并在系统托盘中看到它,那它就非常糟糕,就像边是点缀而不是直线等等。我尝试过16x16,24x24,32x32和48x48相同的文件,但结果很糟糕。

我错过了什么吗?

myNotifyIcon.Icon = SysDir.Properties.Resources.icon2_32_ico_rgba;

2 个答案:

答案 0 :(得分:15)

直接在资源中使用图标的问题是,框架只是将默认图标版本缩放到通知区域所需的大小,而不是在图标文件中选择正确的图标版本。这就是你看到锯齿状边缘的原因。

为了获得最佳品质,您需要自己在图标中选择合适的尺寸。

首先,不要直接将NotifyIcon.Icon设置为资源中的图标,而是创建新的Icon实例。这样做可以让您在图标资源中选择特定的图标大小。使用SystemInformation.SmallIconSize可以获得通知区域所需的大小。

所以:

myNotifyIcon.Icon = new Icon(Properties.Resources.MyIcon, SystemInformation.SmallIconSize);

现在,SystemInformation.SmallIconSize始终返回正确的图标大小,但前提是您的应用程序支持DPI(否则,它总是返回16)。如果您的应用程序不支持DPI,并且它在启用了DPI扩展的系统上使用,则上面的行将选择资源中的16x16图标,它将扩展到通知区域所需的任何大小(换句话说,丑陋的图标)。

通过让您的应用支持DPI,SystemInformation.SmallIconSize将返回正确的尺寸,同时考虑到DPI缩放。例如,如果DPI缩放为150%,SystemInformation.SmallIconSize将返回24(16×1.5)。

要使您的应用能够识别DPI,只需将其添加到<asmv1:assembly>标记内的app.manifest:

  <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>

答案 1 :(得分:6)

编辑:

我链接的信息似乎在这一点上是可疑的。尝试一下,但如果它不起作用,那么我建议您编辑您的问题以发布所有实验的屏幕截图(每个图标大小及其缩放方式)。

原件:

根据此链接,

32x32x256的大小和颜色深度正确:

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

但是在构建该图像时必须非常小心:

  • 拍摄16x16x256图像,让它看起来不错
  • 将其加倍为32x32(如果在绘图程序中执行此操作,请注意不要模糊或重新采样)

原因是Windows会通过简单地丢弃3/4像素将32x32图像“调整”为16x16。上面的链接通过几个屏幕截图展示了这种现象:

在:

Before shrinking icon

后:

After shrinking icon

我不确定在Windows 7上有多少颜色深度挑剔(仅256色?)/重采样问题仍然存在,但在XP上似乎确实如此。