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

时间:2009-03-05 20:34:00

标签: .net windows rendering icons

我有一个嵌入了5个图标大小的.ico文件,用作主应用程序图标和系统托盘图标。

当它出现在任务栏中时,图标使用的是所需的16x16格式。 当图标显示在通知区域/系统托盘中时,它使用32x32格式,Windows将其渲染为16x16图标,这看起来很糟糕。

如何强制窗口在通知区域中使用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 个答案:

答案 0 :(得分:15)

这两种反应都很接近,但含有微妙的毒药。您不应将请求的大小硬编码为16x16。

而是查询SystemInformation.SmallIconSize以确定适当的维度。虽然默认值肯定是16x16,但可以通过各种方式进行更改,例如DPI缩放。

有关此媒体资源的详情,请参阅the MSDN article

使用的一个例子是

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

答案 1 :(得分:7)

改变这个:

notifyIcon.Icon = this.Icon;

到此:

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

答案 2 :(得分: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);