Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is my icon ugly on the tray bar with TTrayIcon?

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

like image 341
Pascal Bergeron Avatar asked Nov 28 '12 13:11

Pascal Bergeron


1 Answers

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;
like image 154
David Heffernan Avatar answered Oct 18 '22 00:10

David Heffernan