8

我最近在 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文件中根本不存在黑色笔划。

搞砸了图标 2

4

3 回答 3

8

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

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

AppTrayIcon.Icon.Handle := IconHandle;
于 2012-11-28T20:29:58.023 回答
6

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

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

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

另请参阅在托盘中显示的最佳图标大小

于 2012-11-28T13:51:55.487 回答
1

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

这个问题让我抓狂,因为这显然是一个 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 中调用它,您的托盘图标就会看起来像设计的那样。

于 2019-07-09T17:20:01.753 回答