myNotifyIcon.Icon = SysDir.Properties.Resources.icon2_32_ico_rgba;
myNotifyIcon.Icon = SysDir.Properties.Resources.icon2_32_ico_rgba;
直接使用资源中的图标存在问题,因为框架不会选择正确版本的图标文件,而是将默认版本的图标按照通知区域需要的大小进行缩放,这就是为什么你看到锯齿状的边缘的原因。
为了获得最佳质量,你需要自己选择正确的图标大小。
首先,不要直接将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>
编辑:
目前我链接的信息似乎有问题。您可以尝试使用,但如果不起作用,建议您编辑您的问题并发布所有实验的截图(每个图标大小和如何缩放)。
原文:
根据此链接,32x32x256是正确的大小和颜色深度:
http://www.hhhh.org/cloister/csharp/icons/
但在构建该图像时必须非常小心:
原因是Windows会通过简单地丢弃3/4的像素来“调整”32x32图像大小为16x16。上面的链接用一些屏幕截图演示了这种现象:
之前:
之后:
我不确定在Windows 7上还有多少颜色深度挑剔性(仅256种颜色?)/重采样问题是正确的,但在XP上似乎肯定是这种情况。
我在一个C# WinForms应用程序中使用NotifyIcon
,无论我使用什么图标,经过2次分辨率更改后,它最终都会变得模糊。
我最好的猜测是,Windows实际上并不会每次重新缩放原始图标,而是从图标缓存中重新缩放(已经缩放过的)版本。
到目前为止,我找到的唯一解决方案是在分辨率/ dpi更改后再次设置图标:
SystemEvents.DisplaySettingsChanged += (sender, eventArgs) => {
trayIcon.Icon = MyIcon;
};
我尝试了各种分辨率和位深度的图标,但最终它们全部都会变得模糊。现在我只使用一个16x16 32位图像作为图标,到目前为止在所有测试的显示器上效果都很好。