7

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

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

我错过了什么吗?

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

2 回答 2

16

直接在资源中使用图标的问题在于,框架没有在图标文件中选择正确的图标版本,而是将默认图标版本简单地缩放到通知区域所需的任何大小。这就是为什么您会看到锯齿状边缘。

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

首先,不要直接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 感知能力,只需将其添加到您的 app.manifest 中的<asmv1:assembly>标签内:

  <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>
于 2014-03-24T02:00:03.680 回答
6

编辑:

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

原来的:

根据此链接,32x32x256 是正确的尺寸和颜色深度:

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

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

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

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

前:

缩小图标之前

后:

缩小图标后

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

于 2011-09-21T08:01:21.073 回答