Windows从多个图标文件中选择了错误的图标,并自行渲染到正确的大小

10
我有一个包含5种图标大小的.ico文件,它被用作主应用程序图标和系统托盘图标。当它出现在任务栏中时,使用16x16格式的图标是期望的。但当图标出现在通知区域/系统托盘中时,它将使用32x32格式并缩小为16x16,看起来很糟糕。如何强制Windows在通知区域中使用16x16图标大小?以下是我用于将图标放入系统托盘的代码:
ContextMenu cmNotify = new ContextMenu();
MenuItem miNotify = new MenuItem(Properties.Resources.Notify_Text);
miNotify.DefaultItem = true;
miNotify.Click += new EventHandler(notifyHandler);
cmNotify.MenuItems.Add(miNotify);


notifyIcon = new NotifyIcon();
notifyIcon.Icon = this.Icon;
notifyIcon.Visible = true;
notifyIcon.ContextMenu = cmNotify;
notifyIcon.Text = AppConstants.APPLICATION_NAME;
3个回答

16

这两个回答都很接近,但都存在微妙的问题。你不应该将所请求的尺寸硬编码为16x16。

相反,应查询SystemInformation.SmallIconSize以确定适当的尺寸。尽管默认值肯定为16x16,但这可能会被各种事物更改,例如DPI缩放。

有关此属性的更多信息,请参见MSDN文章

使用示例:

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, SystemInformation.SmallIconSize),

7

将此更改为:

notifyIcon.Icon = this.Icon;

转换为:

notifyIcon.Icon = new System.Drawing.Icon(this.Icon, 16, 16);

1

您需要创建一个图标的新实例。在创建(加载)新实例时,请指定大小。Icon类构造函数有几个不同的重载供您选择。如果图标文件嵌入到主可执行文件中(这通常是情况),则可以按照以下方式执行:

Assembly asm = this.GetType().Assembly;

var smallIconSize = new System.Drawing.Size(16, 16);
notifyIcon.Icon = new System.Drawing.Icon(
    asm.GetManifestResourceStream("MyPrettyAppIcon.ico"), smallIconSize);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接