为什么我的图标在带有TTrayIcon的托盘栏上很难看?

时间:2012-11-28 13:43:21

标签: delphi alpha blur tray

我最近在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上,结果全部搞砸了:

Screwed-up icon

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

Screwed-up icon 2

3 个答案:

答案 0 :(得分:8)

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

对于通知区域,您需要使用尺寸由SM_CXSMICON系统指标确定的方形图标。获得此功能的最佳方法是调用LoadImage,它允许您指定图标大小。将图标加载到HICON后,您就可以写下:

AppTrayIcon.Icon.Handle := IconHandle;

答案 1 :(得分:6)

您的图标没有合适的尺寸或颜色深度。

您可以使用图标编辑器为单个.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

答案 2 :(得分:0)

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

这个问题使我发疯,因为实际上这显然是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中调用它,您的任务栏图标将看起来像设计的一样。