Pregunta

I recently discovered the TTrayIcon component in Delphi 2007. The code used is pretty straightforward.

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;

Since there is no icon assigned, Delphi uses Application.Icon, which is that icon: http://artbyloveland.com/icon.ico This icon includes the following sizes: 64x64, 48x48, 32x32, 24x24 and 16x16.

Now, on my Windows Vista, everything fine.

On a non-themed Windows like Windows Server 2003, the result is all screwed-up:

Screwed-up icon

EDIT: At first, I thought it was because of the alpha channel. So I tried to make a version of the ico file without the use of alpha channel. I also tried GreenFish Icon Editor as suggested by Ken; I selected every color depth and every size available. In both cases, the end result is better. However, there is a black stroke that doesn't exist at all in the ico file.

Screwed-up icon 2

¿Fue útil?

Solución

You state that you are not assigning the icon. In which case the component uses Application.Icon. But that will typically be an icon that is the wrong size for the notification area.

For the notification area you need to use a square icon with size determined by the SM_CXSMICON system metric. The best way to get that is to call LoadImage which allows you to specify the icon size. Once you have loaded the icon into an HICON you can just write this:

AppTrayIcon.Icon.Handle := IconHandle;

Otros consejos

You don't have the proper size or color depth for your icon.

You can use an icon editor to provide multiple size and color depth icons to a single .ico file, and Windows will automatically choose the proper one based on the user's settings and video driver configuration. Windows will then have several choices to use when selecting the closest match, and the scaling and blending will have a much better appearance.

I use GreenFish Icon Editor, which is donation-ware. It will allow you to open any supported graphic type and then create a Windows icon with multiple color depths and resolutions automatically from it (see the Icon menu). I've tested the multi-image icon files in Delphi 7, 2007, 2010, XE, and XE3, and they work fine for the Application.Icon and TForm.Icon.

Also see Best Icon size for displaying in the tray

I thought, I'd share my solution to this problem, as there is currently no complete solution here.

This problem was driving me nuts, because this is actually clearly a Delphi/VCL bug. If you assign an icon with all required sizes (16, 24, 32, 48, 256) to your project, Delphi should automatically use the correct size in TTrayIcon, but instead it only takes the 32px icon and scales it down.

Since the required images are already in the exe file (for being displayed in the Windows Explorer), you can simply fix it like this:

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;

Just call it in FormCreate and your tray icon will look as designed.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top