![]() |
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 |
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:
|
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 |
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 |
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 |
Re: Farbtiefe bei Tray-Icon anpassen
Zitat:
|
Re: Farbtiefe bei Tray-Icon anpassen
Eben gerade nicht!!!
Wie ich schon schrieb: Zitat:
Unter Windows XP stimmt die Tray-Farbtiefe mit dem Schlüssel überein, unter Windows 9x kann ich es gerade nicht testen. |
Re: Farbtiefe bei Tray-Icon anpassen
Zitat:
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! |
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: ![]() 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 |
Re: Farbtiefe bei Tray-Icon anpassen
Zitat:
![]() 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. |
Re: Farbtiefe bei Tray-Icon anpassen
Hi Daniel,
klingt echt gut, dein Vorschlag. Ich habe damit jetzt folgenden Code produziert:
Delphi-Quellcode:
Allerdings liefert LoadIcon immer NULL zurück, weshalb auch kein Icon dargestellt wird. :wall:
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); 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? |
Re: Farbtiefe bei Tray-Icon anpassen
Zitat:
Bastel dir mal eine Ressourcen - Datei (*.rc) mit folgendem Eintrag
Code:
Die jagst du durch den Ressourcen - Compiler (brcc32.exe) um deine *.res zu bekommen.
100 ICON DISCARDABLE "online.ico"
Die bindest du dann in dein Programm ein und änderst die Zeile so um:
Delphi-Quellcode:
Dann sollte es klappen...
hIcon := LoadIcon(HInstance, MakeIntResource(100);
|
Re: Farbtiefe bei Tray-Icon anpassen
Zitat:
![]() |
Re: Farbtiefe bei Tray-Icon anpassen
Oder einfach Luckie's Programm verwenden. :wink:
![]() @OregonGhost: Hey, ein Kieler. :mrgreen: |
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:
|
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:
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:
|
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? |
Re: Farbtiefe bei Tray-Icon anpassen
So, ich habe jetzt noch einige Tests durchgeführt, und folgendes herausgefunden:
Zitat:
Dies mal etwas weiter gedacht:
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 ![]() 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:
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.
Image1.Picture.Icon.Handle := LoadIcon(hInstance, MakeIntResource(100));
Also bleibt die Frage: Wie bekomme ich überhaupt ein Handle auf ein 16x16 Icon? |
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 16:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz