我最近在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 Icon Editor;我选择了每种颜色深度和每种尺寸。在这两种情况下,最终结果都更好。但是,ico文件中根本不存在黑色笔划。
答案 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.Icon
和TForm.Icon
。
答案 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中调用它,您的任务栏图标将看起来像设计的一样。