2012-11-28 6 views
8

Ich habe vor kurzem die TTrayIcon-Komponente in Delphi 2007 entdeckt. Der verwendete Code ist ziemlich einfach.Warum ist mein Icon in der Tray-Leiste mit TTrayIcon hässlich?

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; 

Da zugewiesen kein Symbol ist, verwendet Delphi Application.Icon, die das Symbol ist: 64x64, 48x48, 32x32, 24x24 und 16x16: http://artbyloveland.com/icon.ico Dieses Symbol, um die folgenden Größen enthält.

Jetzt, auf meinem Windows Vista, alles in Ordnung.

Auf Nicht-Themen Windows-wie Windows Server 2003, ist das Ergebnis alle verkorkste:

Screwed-up icon

EDIT: Zuerst dachte ich, es wegen des Alphakanals war. Also habe ich versucht, eine Version der ico-Datei ohne Alphakanal zu erstellen. Ich habe auch GreenFish Icon Editor wie von Ken vorgeschlagen versucht; Ich habe jede Farbtiefe und jede verfügbare Größe ausgewählt. In beiden Fällen ist das Endergebnis besser. Es gibt jedoch einen schwarzen Strich, der überhaupt nicht in der ico-Datei existiert.

Screwed-up icon 2

+0

Sie benötigen eine HICON, die kleine Symbolgröße ist. Rufen Sie GetSystemMetrics auf, um herauszufinden, wie groß das ist. Wenn der Wert beispielsweise 20 ist, haben Sie nicht die richtige Größe. Wahrscheinlicher ist, dass die Komponente ein einfaches altes LoadIcon verwendet und Sie ein 32-Pixel-Symbol haben, das erneut abgetastet wurde. –

+0

Nun, selbst wenn es 20 wäre, könnte es etwas anderes für eine andere Computerinstallation sein, oder? Auf jeden Fall bekomme ich 16 für SM_CXSMICON auf meinem Windows 2003 Server. Ich kann den Fehler teilweise beheben, indem ich Kens Rat anwende; Es gibt jedoch immer noch einen schwarzen Strich, der in der ico-Datei nicht existiert. –

+0

Ich rufe immer 'Shell_NotifyIcon' an und gebe ein' HICON' ein, das ich mit 'LoadImage' gemacht habe. VCL Umgang mit Symbolen ist hoffnungslos.Ich sehe keinen Beweis dafür, dass Sie etwas anderes tun, als diese Komponente "Application.Icon" verwenden zu lassen, was zum Scheitern verurteilt ist. –

Antwort

8

Sie erklären, dass Sie nicht auf das Symbol zuweisen. In diesem Fall verwendet die Komponente Application.Icon. Dies ist jedoch normalerweise ein Symbol mit der falschen Größe für den Infobereich.

Für den Benachrichtigungsbereich müssen Sie ein quadratisches Symbol mit der Größe verwenden, die durch die Systemmetrik SM_CXSMICON festgelegt wird. Der beste Weg, um das zu bekommen, ist LoadImage anrufen, mit dem Sie die Symbolgröße angeben können. Sobald Sie das Symbol in eine HICON geladen haben, können Sie einfach schreiben:

+0

+1. Netter Fang, David. Es heißt eigentlich, dass in der Frage (erster Satz nach dem letzten Codeblock), aber ich habe es vermisst (und anscheinend auch alle anderen). –

+0

@Ken danke, ich habe den Text jetzt verbessert –

6

Sie haben nicht die richtige Größe oder Farbtiefe für Ihr Symbol.

Sie können einen Symboleditor verwenden, um einer einzelnen .ico Datei mehrere Größen- und Farbtiefensymbole zur Verfügung zu stellen, und Windows wählt automatisch die richtige Einstellung basierend auf den Benutzereinstellungen und der Grafiktreiberkonfiguration aus. Windows wird dann mehrere Auswahlmöglichkeiten haben, um die am besten passende Übereinstimmung zu finden, und die Skalierung und Mischung wird viel besser aussehen.

Ich verwende GreenFish Icon Editor, die Spende-Ware ist. Es ermöglicht Ihnen, jeden unterstützten Grafiktyp zu öffnen und dann automatisch ein Windows-Symbol mit mehreren Farbtiefen und Auflösungen zu erstellen (siehe Menü Icon). Ich habe die Multi-Image-Icon-Dateien in Delphi 7, 2007, 2010, XE und XE3 getestet, und sie funktionieren gut für die Application.Icon und TForm.Icon.

Siehe auch Best Icon size for displaying in the tray

+0

Sind Sie sicher, dass der Link zum Icon-Editor korrekt ist? –

+0

Die Frage besagt, dass sich in der Datei bereits fünf Symbolgrößen befinden. Welche Größe fehlt, wodurch eine minderwertige Größe für den Infobereich ausgewählt wird? –

+0

@Andreas: Ich habe es von der Hilfe-> About Seite von GFIE selbst kopiert. Ich werde es stattdessen zu einem Download-Link ändern (kann nicht sehen, wo es von wo ich gerade bin). –