【问题标题】:Why is my icon ugly on the tray bar with TTrayIcon?为什么我的图标在带有 TTrayIcon 的托盘栏上很难看?
【发布时间】:2012-11-16 09:17:21
【问题描述】:

我最近在 Delphi 2007 中发现了 TTrayIcon 组件。使用的代码非常简单。

procedure TForm1.FormCreate(Sender: TObject);
begin
 AppTrayIcon := TTrayIcon.Create(nil);
 AppTrayIcon.OnDblClick := OnAppTrayIconDblClick;
 Application.OnMinimize := OnApplicationMinimize;
 Application.OnRestore := OnApplicationRestore;
end;

procedure TForm1.OnApplicationRestore(Sender: TObject);
begin
 AppTrayIcon.Visible := False;
 ShowWindow(Application.Handle, SW_SHOW);
 Application.BringToFront;
end;

procedure TForm1.OnApplicationMinimize(Sender: TObject);
begin
 AppTrayIcon.Visible := True;
 ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.OnAppTrayIconDblClick(Sender: TObject);
begin
 Application.Restore;
end;

由于没有分配图标,Delphi 使用 Application.Icon,也就是那个图标:http://artbyloveland.com/icon.ico 这个图标包括以下尺寸:64x64、48x48、32x32、24x24 和 16x16。

现在,在我的 Windows Vista 上,一切正常。

在像 Windows Server 2003 这样的非主题 Windows 上,结果完全搞砸了:

编辑: 起初,我以为是因为 alpha 通道。所以我尝试在不使用 alpha 通道的情况下制作 ico 文件的版本。我还按照 Ken 的建议尝试了 GreenFish 图标编辑器;我选择了每种颜色深度和每种可用尺寸。在这两种情况下,最终结果都更好。但是,ico文件中根本不存在黑色笔划。

【问题讨论】:

  • 你需要一个小图标的HICON。调用 GetSystemMetrics 以了解它有多大。例如,如果值为 20,那么您的尺寸不正确。更可能的是,该组件使用的是普通的旧 LoadIcon,并且您有一个重新采样的 32px 图标。
  • 好吧,即使它是 20,也可能是另一台计算机安装的其他东西,对吧?无论如何,我在 Windows 2003 服务器上的 SM_CXSMICON 得到 16。我可以通过应用 Ken 的建议来部分修复该错误;但是,在ico文件中仍然存在最初不存在的黑色笔划。
  • 我总是打电话给Shell_NotifyIcon 并传入我用LoadImage 制作的HICON。 VCL 对图标的处理是没有希望的。除了让这个组件使用Application.Icon 之外,我没有看到任何证据表明你正在做任何事情,这注定要失败。
  • 使用 Shell_NotifyIcon 并通过 LoadImage 加载图标就可以了!最终结果是完美的。我如何接受你的回答?
  • 我会给你写一个你可以接受的答案。

标签: delphi alpha blur tray


【解决方案1】:

您的图标大小或颜色深度不合适。

您可以使用图标编辑器为单个.ico 文件提供多个大小和颜色深度的图标,Windows 将根据用户的设置和视频驱动程序配置自动选择合适的图标。在选择最接近的匹配时,Windows 将有多个选项可供使用,并且缩放和混合将具有更好的外观。

我使用GreenFish Icon Editor,这是一种捐赠软件。它将允许您打开任何支持的图形类型,然后从中自动创建具有多种颜色深度和分辨率的 Windows 图标(请参阅Icon 菜单)。我已经在 Delphi 7、2007、2010、XE 和 XE3 中测试了多图像图标文件,它们适用于 Application.IconTForm.Icon

另见Best Icon size for displaying in the tray

【讨论】:

  • 问题说文件中已经有五个图标大小。缺少哪个尺寸会导致为通知区域选择了较差的尺寸?
  • @Andreas:我从 GFIE 本身的“帮助”->“关于”页面复制了它。我会将其修改为下载链接(看不到它从我现在所在的位置结束)。
  • @Rob:我发布答案时没有看到尺寸;我看到的只是 icon.ico 文件的链接。当我发布我的帖子时,海报一定还在更新原始帖子(或者我根本无法在喝咖啡之前阅读)。还有颜色深度的问题。
  • 然后向艾伦提出一个问题:您为图标添加了哪种尺寸或颜色深度来解决您的问题?如果您没有添加任何内容,那么您不应该接受这个答案。
  • 投反对票的人愿意解释一下吗?我的回答在事实或技术上有什么问题?
【解决方案2】:

您声明您没有分配图标。在这种情况下,组件使用Application.Icon。但这通常是通知区域大小错误的图标。

对于通知区域,您需要使用大小由SM_CXSMICON 系统指标确定的方形图标。最好的方法是调用LoadImage,它允许您指定图标大小。将图标加载到HICON 后,您可以这样写:

AppTrayIcon.Icon.Handle := IconHandle;

【讨论】:

  • +1。不错的收获,大卫。它实际上在问题中说(最后代码块之后的第一句话),但我错过了它(显然其他人也是如此)。
【解决方案3】:

我想,我会分享我对这个问题的解决方案,因为这里目前没有完整的解决方案。

这个问题把我逼疯了,因为这显然是一个 Delphi/VCL 错误。如果你为你的项目分配了一个具有所有所需尺寸(16、24、32、48、256)的图标,Delphi 应该会自动在 TTrayIcon 中使用正确的尺寸,但它只需要 32px 的图标并将其缩小。

由于所需的图像已经在 exe 文件中(用于显示在 Windows 资源管理器中),您可以像这样简单地修复它:

procedure FixTrayIcon(TrayIcon: TTrayIcon);
var
  i: Integer;
begin
  i := GetSystemMetrics(SM_CXSMICON); //Gets the correct size for the tray (e.g. 16)
  TrayIcon.Icon.Handle := LoadImage(hInstance, 'MAINICON', IMAGE_ICON, i, i, LR_DEFAULTCOLOR);
  TrayIcon.SetDefaultIcon; //Updates the icon
end;

只需在 FormCreate 中调用它,您的托盘图标就会看起来像设计的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2011-07-06
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多