我在Windows 7上使用Visual Studio 2010,C#。
我在项目中添加了一个通知控件,并将其设置为我导入项目的图标。如果我只是预览它,图标图像真的很好看,但是一旦我运行我的代码并在系统托盘中看到它,那它就非常糟糕,就像边是点缀而不是直线等等。我尝试过16x16,24x24,32x32和48x48相同的文件,但结果很糟糕。
我错过了什么吗?
myNotifyIcon.Icon = SysDir.Properties.Resources.icon2_32_ico_rgba;
答案 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/
但是在构建该图像时必须非常小心:
原因是Windows会通过简单地丢弃3/4像素将32x32图像“调整”为16x16。上面的链接通过几个屏幕截图展示了这种现象:
在:
后:
我不确定在Windows 7上有多少颜色深度挑剔(仅256色?)/重采样问题仍然存在,但在XP上似乎确实如此。