我有一个嵌入了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;
答案 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);