Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Farbtiefe bei Tray-Icon anpassen (https://www.delphipraxis.net/75527-farbtiefe-bei-tray-icon-anpassen.html)

c.wuensch 21. Aug 2006 00:17


Farbtiefe bei Tray-Icon anpassen
 
Hallo,

meine Anwendung soll ein Tray-Icon anzeigen. Dazu gibt es ja schon unzählige Beiträge. Was ich allerdings nirgendwo finden konnte ist folgendes:

Unter Windows XP werden Tray-Icons meist mit 256 Farben (oder sogar 24 bit?) dargestellt, unter anderen Windows-Versionen (z.B. Win2k) nur mit 16 Farben.

Wie kriege ich es jetzt hin, dass je nach eingestellter Symbol-Farbtiefe des Systems ein jeweils darauf optimiertes Icon angezeigt wird?
(Es sollte nicht die Windows-Version als Kriterium benutzt werden, da man es in manchen Versionen umstellen kann...)

Cu, Chris

Meflin 21. Aug 2006 00:21

Re: Farbtiefe bei Tray-Icon anpassen
 
Wenn ich mich recht entsinne kann man ja in einer *.ico Datei mehrere Versionen seines Icons abspeichern, z.B. 32x32-128x128px in einer Datei. Wenn du also die verschiedenen Farbtiefen in einer Datei zusammenfasst, könnte ich mir vorstellen dass sich das OS das passende raussucht, wie es das bei der Größe auch tut. Das ist aber nur eine Vermutung und müsste experimentell nachgewiesen werden :mrgreen:


_frank_ 21. Aug 2006 00:28

Re: Farbtiefe bei Tray-Icon anpassen
 
wenn der tip von Meflin nicht funktionieren sollte, funktioniert evtl. das:

in der registry unter
HKEY_CURRENT_USER \ Control Panel \ Desktop \WindowMetrics
den Wert für "Shell Icon BPP" auslesen (weis nicht, ob das auch für Tray-Icons gilt)
und je nach Wert (8/16/24) das passende Trayicon zuzuweisen
HTH Frank

c.wuensch 21. Aug 2006 18:37

Re: Farbtiefe bei Tray-Icon anpassen
 
Hallo,

danke für eure Mühe!

Der Tipp von Meflin ist nicht schlecht (diese Idee hatte ich auch schon). Bisher habe ich das Icon aber aus einer ImageList genommen, und diese unterstützt nun mal nur ein Bild und nicht mehrere.

Das Problem besteht jetzt also darin, dass ich nicht weiß, wie ich das Handle einer ganzen Icon-Datei (d.h. eigentlich soll es dann eine Resource sein) bekomme, um dieses im Tray darzustellen.

Kann mir da vielleicht einer helfen?

Cu, Chris

c.wuensch 21. Aug 2006 21:59

Re: Farbtiefe bei Tray-Icon anpassen
 
@_frank_:
Ich habe deinen Tipp natürlich auch probiert (auf mehreren Rechnern).
Der genannte Registry-Wert gibt allerdings nur die Symbol-Farbtiefe des Systems an, die sich von der des Trays unterscheiden kann (Beispiel: Windows 2000, hier hat das Tray immer nur 16 Farben).

Nach langem Googeln habe ich festgestellt, dass es wohl tatsächlich ein größeres Problem ist, ein Icon bestehend aus mehreren "Bildchen" zu laden, da die TIcon-Komponente wohl nur ein Bild laden kann.

Hat vielleicht irgendjemand eine Idee, wie dies dennoch zu bewerkstelligen wäre?

Cu, Chris

Meflin 21. Aug 2006 22:01

Re: Farbtiefe bei Tray-Icon anpassen
 
Zitat:

Der genannte Registry-Wert gibt allerdings nur die Symbol-Farbtiefe des Systems an
Ist das dann nicht eine relativ einfache Lösung? Du lieferst die verschiedenen Farbtiefe-Varianten als einzelne Dateien mit. Über den Registry-Wert kannst du auslesen, welche Farbtiefe verwendet wird, und das entsprechende Icon einbinden :)


c.wuensch 21. Aug 2006 22:42

Re: Farbtiefe bei Tray-Icon anpassen
 
Eben gerade nicht!!!

Wie ich schon schrieb:
Zitat:

die sich von der des Trays unterscheiden kann
Als Beispiel habe ich mein Windows 2000 System angeführt. Die Symbol-Farbtiefe kann ich hier auf 16, 24 oder 32 bit stellen (was sich auch auf diesen Registry-Schlüssel auswirkt) aber die Tray-Icons haben trotz allem IMMER 8 bit (also 16 Farben).

Unter Windows XP stimmt die Tray-Farbtiefe mit dem Schlüssel überein, unter Windows 9x kann ich es gerade nicht testen.

Meflin 21. Aug 2006 22:55

Re: Farbtiefe bei Tray-Icon anpassen
 
Zitat:

Zitat von c.wuensch
die sich von der des Trays unterscheiden kann

:wall: hab ich irgendwie überlesen :roll:

Allerdings verstehe ich nun nicht ganz wieso du das Icon in eine TIcon-Komponente laden musst :stupid: um dir un weiterzuhelfen wäre es wohl hilfreich zu wissen wie du deine Anwendung überhaupt in den Tray bringst! Wenn du z.B. eine Komponente wie TTrayIcon verwendest musst du doch die *.ico-Datei ienfach nur zuweisen, egal wie viele Versionen die letztlich beinhaltet!


c.wuensch 21. Aug 2006 23:54

Re: Farbtiefe bei Tray-Icon anpassen
 
Im Prinzip ist es mir egal, auf welche Weise das Icon erzeugt wird, wenn es funktioniert und mit entsprechender Farbtiefe angezeigt wird :).

Eigentlich wollte ich es direkt per API-Befehl erzeugen, und zwar nach folgendem Tutorial:
http://delphi.about.com/od/kbwinshell/l/aa121801a.htm

Eine Komponente wäre mir aber ebenso recht. Ich habe jetzt mal eben die TTrayIcon VCL. Version 1.3 von Pete Ness probiert. Aber dort wird das Icon (wie vermutlich in anderen Komponenten auch) über ein Image geladen ==> also ist nur ein Bildchen verfügbar.

Ich hoffe ja immernoch, dass irgendjemand mir da weiterhelfen kann... (bei anderen Programmen klappt es ja schließlich auch!)

Cu, Chris

Daniel G 22. Aug 2006 00:10

Re: Farbtiefe bei Tray-Icon anpassen
 
Zitat:

Zitat von c.wuensch
wie ich das Handle einer ganzen Icon-Datei (d.h. eigentlich soll es dann eine Resource sein) bekomme

Evtl. über MSDN-Library durchsuchenLoadIcon? :stupid:

meflin's Überlegung vom Anfang mit den mehreren Bit - Versionen war schon ganz richtig, so würde ich es auch machen. Dann würde ich das Beispiel mit dem direkten API nehmen und das Handle zu hIcon einfach über LoadIcon bekommen.

c.wuensch 22. Aug 2006 15:20

Re: Farbtiefe bei Tray-Icon anpassen
 
Hi Daniel,

klingt echt gut, dein Vorschlag. Ich habe damit jetzt folgenden Code produziert:
Delphi-Quellcode:
  With TrayIconData Do Begin
    cbSize := SizeOf(TrayIconData);
    Wnd := Handle;
    uID := 0;
    uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
    uCallbackMessage := WM_USER+1;
    hIcon := LoadIcon(0, 'c:\online.ico');
    StrPCopy(szTip, Application.Title);
  End;
  Shell_NotifyIcon(NIM_ADD, @TrayIconData);
Allerdings liefert LoadIcon immer NULL zurück, weshalb auch kein Icon dargestellt wird. :wall:

Die angegebene Icon-Datei existiert, und beinhaltet 2 Icons mit jeweils 16x16 Pixel in den Farbtiefen 16 Farben und 256 Farben (bei Bedarf kann ich es auch gerne anhängen, falls es am Icon liegen sollte).

Kann irgendjemand dieses Problem nachvollziehen, und vielleicht einen Lösungsvorschlag machen?

Cu, Chris

Edit: Ich habe mal GetLastError aufgerufen, und als Ergebnis '1813' erhalten. Was heißt das jetzt und wie könnte ich den Fehler vielleicht beheben?

Daniel G 22. Aug 2006 15:29

Re: Farbtiefe bei Tray-Icon anpassen
 
Zitat:

Zitat von c.wuensch
Kann irgendjemand dieses Problem nachvollziehen

Jabb, ich. Das Problem liegt bei dir, weil du nicht lesen kannst. :mrgreen:

Bastel dir mal eine Ressourcen - Datei (*.rc) mit folgendem Eintrag

Code:
100                     ICON   DISCARDABLE    "online.ico"
Die jagst du durch den Ressourcen - Compiler (brcc32.exe) um deine *.res zu bekommen.

Die bindest du dann in dein Programm ein und änderst die Zeile so um:

Delphi-Quellcode:
hIcon := LoadIcon(HInstance, MakeIntResource(100);
Dann sollte es klappen...

OregonGhost 22. Aug 2006 15:32

Re: Farbtiefe bei Tray-Icon anpassen
 
Zitat:

Ich habe mal GetLastError aufgerufen, und als Ergebnis '1813' erhalten. Was heißt das jetzt und wie könnte ich den Fehler vielleicht beheben?
Ich kann dir zwar jetzt nicht bei deinem Problem helfen, aber für deinen nächsten GetLastError-Aufruf System Error Codes im MSDN empfehlen :)

Daniel G 22. Aug 2006 15:34

Re: Farbtiefe bei Tray-Icon anpassen
 
Oder einfach Luckie's Programm verwenden. :wink:

http://michael-puff.de/Developer/Del...rrorMsg1_1.zip

@OregonGhost: Hey, ein Kieler. :mrgreen:

c.wuensch 22. Aug 2006 15:38

Re: Farbtiefe bei Tray-Icon anpassen
 
:wall: Ja, das Programm kompiliert und zeigt ein Icon an - allerdings wieder das herunterskalierte 256-Farb-Icon :gruebel: :wall:

Edit: Und das auch dann, wenn im System alle Icons auf 16 Farben eingestellt sind!!!

Edit2: Und das obwohl im MSDN steht:
Zitat:

The function searches the icon resource for the icon most appropriate for the current display.

OregonGhost 22. Aug 2006 15:46

Re: Farbtiefe bei Tray-Icon anpassen
 
Ich fürchte, die TNA ist sowieso hoffnungslos veraltet, zumindest vor Windows XP und selbst da ist sie sehr unzulänglich (oder warum kann man keine PNGs da reinpacken?^^). Insofern könntest du sie auch von Hand als Legacy-Dings unterstützen und unter Windows bis NT5.0 nur ein 16-Farb-Icon laden und ab NT5.1 ein 256-Farb-Icon, wie wäre das?

Zitat:

Note This function hase been superseded by the LoadImage function. [...] The function searches the icon resource for the icon most appropriate for the current display.
Wenn ich das richtig interpretiere, lädt LoadIcon das Icon, das der Bildschirmauflösung entspricht, wenn möglich - also das 256-Farb-Icon. Hast du mal geguckt, was das Ding macht, wenn du die Systemfarben auf 16 setzt? Wobei, das geht bestimmt nicht ^^
Jedenfalls, da steht nichts davon, dass es sich an deine Einstellungen hält, nur, dass es das für die Anzeige günstigste Icon lädt :mrgreen:

Zitat:

Zitat von Daniel G.
@OregonGhost: Hey, ein Kieler.

Moin ;)

c.wuensch 22. Aug 2006 15:54

Re: Farbtiefe bei Tray-Icon anpassen
 
Es gibt übrigens noch immer einen Fehler beim Laden des Icons! Und zwar Error 6 - Das Handle ist ungültig.
Woran kann das denn schon wieder liegen?

c.wuensch 22. Aug 2006 21:48

Re: Farbtiefe bei Tray-Icon anpassen
 
So, ich habe jetzt noch einige Tests durchgeführt, und folgendes herausgefunden:

Zitat:

Zitat von OregonGhost
Wenn ich das richtig interpretiere, lädt LoadIcon das Icon, das der Bildschirmauflösung entspricht, wenn möglich - also das 256-Farb-Icon. Hast du mal geguckt, was das Ding macht, wenn du die Systemfarben auf 16 setzt? [...]
Jedenfalls, da steht nichts davon, dass es sich an deine Einstellungen hält, nur, dass es das für die Anzeige günstigste Icon lädt :mrgreen:

Das stimmt tatsächlich :roll: - wenn ich die Farbtiefe auf 256 Farben reduziere, erscheint auf einmal mein 16-Farb-Icon!
Dies mal etwas weiter gedacht:
  • Welche Icon-Größe lädt denn Loadimage überhaupt?
  • Liefert LoadImage bei einer Bildschirmauflösung von 1024 x 768 x 16bit vielleicht immer ein 32 x 32 x 8bit Icon?
  • Und was passiert, wenn in der Icon-Datei nur ein 16x16 Icon enthalten ist -> wird dieses dann entsprechend hochskaliert?

Wie kann ich denn die Antworten auf diese Fragen herausfinden? Wisst ihr vielleicht eine Quelle, wo man sowas nachlesen könnte (der MSDN-Artikel ist ja mehr als dürfig...)? Oder kennt ihr eine Möglichkeit, das zu testen?

---------------------------------------

Und nochwas:
Auf http://www.hhhh.org/cloister/csharp/icons/ habe ich gelesen, dass Windows für die Tray-Icons doch tatsächlich das 32x32 Icon nehmen und entsprechend auf 16x16 herunterskalieren soll. :gruebel:

Dafür spricht die Tatsache, dass das im Tray angezeigte Icon nicht wirklich mit dem 16x16 Icon übereinstimmt. Also scheint wirklich eine Hoch- und wieder Herunterskalierung zu erfolgen...

Die Frage ist aber jetzt: Passiert die Hochskalierung schon in LoadIcon (s.o.), so dass Windows also gar nichts anderes übrig bleibt, als das Icon wieder herunterzuskalieren, oder macht das tatsächlich Windows alleine (denn dann wäre es ja günstiger, ihm gleich ein 32x32 Icon vorzusetzen)?

Und noch eine Frage: Gibt es denn überhaupt eine Möglichkeit, beim Laden eines Icons festzulegen, welches "Unter-Icon" genommen werden soll, und welche Auflösung und Farbtiefe das zurückgelieferte Icon haben soll?

Bitte helft mir, sonst werde ich noch irgendwann an diesem ganzen Icon-Mist verzweifeln... :cry:

-----------------------------------------

Edit: Habe es mit folgendem Code testen können:
Delphi-Quellcode:
Image1.Picture.Icon.Handle := LoadIcon(hInstance, MakeIntResource(100));
Ergebnis: LoadIcon skaliert tatsächlich auf 32 x 32 x 8bit hoch, wenn nur ein 16 x 16 x 4bit Icon in der Datei enthalten ist.
Also bleibt die Frage: Wie bekomme ich überhaupt ein Handle auf ein 16x16 Icon?

c.wuensch 24. Aug 2006 21:38

Re: Farbtiefe bei Tray-Icon anpassen
 
Leider hänge ich noch immer an dem Problem fest :cry:
Hat denn da niemand eine Idee?

Cu, Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz