![]() |
Icon im Tray (TNA) animieren bzw. ändern
Hallo,
möchte gerne ein Icon im Tray (TNA) animieren bzw. zur Laufzeit verändern. Das Handle auf das Icon habe ich, wie bekomme ich Zugriff auf dessen Canvas? Vielen Dank für eure Anworten, |
Re: Icon im Tray (TNA) animieren bzw. ändern
Hai!
Handle? Hast du da nicht eine Komponente genommen? Dort kann man eine TImageList hinterlegen und ablaufen lassen. TCoolTrayIcon oder das Standardteil aus den neueren Versionen. Stefan |
Re: Icon im Tray (TNA) animieren bzw. ändern
Hi,
eine andere Möglichkeit wäre die Verwendung von Shell_NotifyIcon(): Hier einige Auszüge.... Geht nur mit ICONs zum convertieren zw. bmp und ICO gibs hier auch code. Farbige TrayIcons funktionieren erst ab WinXp. Das CahngeTrayIcon in nen Thread gepackt ne TimageList mit ICONs dazu und fertig ist das Ganze... Die "WM_USER_ICONMSG" dient lediglich um Mausklicks auf dem icon auszuwerten. Diese Message muss in der WndProc des in "FIconData.Wnd" angegebenen Fensters entsprechend abgefangen werdne. Shalom
Delphi-Quellcode:
uses
ShellApi; const WM_USER_ICONMSG = WM_USER + 123; var FIconData: TNotifyIconData; function GetAppIcon(var AIcon: TIcon; const ASmall: Boolean = False): Boolean; const dwIconFlags : array[Boolean]of DWORD = (SHGFI_LARGEICON, SHGFI_SMALLICON); var fi : TSHFileInfo; begin Result := False; Assert(AIcon <> nil); // Symbol der Datei aus dem System ermitteln // Typ (= groß/klein) richtet sich nach dem // Funktionsparameter "fSmall" (default = false) ZeroMemory(@fi, sizeof(fi)); SHGetFileInfo(pchar(Application.Exename), 0, fi, sizeof(fi), SHGFI_ICON or dwIconFlags[ASmall]); // Symbol ermittelt if (fi.hIcon <> 0) then begin AIcon.Handle := fi.hIcon; Result := True; end; end; procedure CreateIconData; var i: Integer; begin GetAppIcon(FAppIconICO, True); FIconData.cbSize := SizeOf(FIconData); FIconData.Wnd := FWindow.Handle; FIconData.uID := 123; FIconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; FIconData.uCallBackMessage := WM_USER_ICONMSG; FIconData.hIcon := FAppIconICO.Handle; for i := 1 to Length(Application.Title) do begin FIconData.szTip[i-1] := Application.Title[i]; end; end; procedure AddIconToTNA; begin if not FTNAIconActive then if Shell_NotifyIcon(NIM_ADD, @FIconData) then begin FTNAIconActive := True; end; end; procedure ChangeTrayIcon(AIcon: HICON; const AHint: String); var i: Integer; begin if AIcon <> INVALID_HANDLE_VALUE then FIconData.hIcon := AIcon; for i := 1 to Length(AHint) do begin FIconData.szTip[i-1] := AHint[i]; end; Shell_NotifyIcon(NIM_MODIFY, @FIconData); //Icon aktualisiern end; |
Re: Icon im Tray (TNA) animieren bzw. ändern
Danke für die Antworten, habe mich wohl nicht klar genug ausgedrückt:
Eigentlich möchte ich einen Text in der TNA anzeigen, der zu lang für ein einzelnes Icon ist. Habe es mit mehreren TextTrayIcons versucht, was auch funktioniert, aber ein längerer Text sollte nicht nach 2 Zeichen unterbrochen sein und es sieht halt irgendwie komisch aus, wenn auf jedem Icon nur 2 Zeichen stehen. Meine Idee war, mehrere CoolTrayIcons zu nehmen und den Text auf diese zu verteilen. Was mich dabei stört, sind die Trennpixel zwischen den Icons. Bekomme ich die irgendwie weg? Könnte ich nicht auch ein Panel oder Label über mehrere CoolTrayIcons legen und darauf den Text schreiben, also den Inhalt der Icons mitsamt Trennpixel einfach überschreiben? Wie bekomme ich dann die Positionen (X/Y) aller meiner Icons auf dem Desktop? Vielen Dank für eure Antworten. |
Re: Icon im Tray (TNA) animieren bzw. ändern
Der Bereich ist nicht dazu gedacht einen Text darzustellen, sondern eben nur Icons. Und ein Programm, welches da unter gleich drei Icons produziert, wäre nicht lange auf meinem Rechner.
|
Re: Icon im Tray (TNA) animieren bzw. ändern
Außerdem kann man ja auch ungenutzte Icons im Tray-Bereich ausblenden. Deine Idee wird also wohl nicht so richtig funktionieren. Was du dir evtl. anschauen könntest, wäre ein sog.
![]() mfg |
Re: Icon im Tray (TNA) animieren bzw. ändern
Es war nicht meine Idee, aber ein mir bekannter Admin möchte unbedingt auf allen Computern in der TNA direkt links neben der Uhr einen Text stehen haben.
Ein Deskband kommt nicht in Frage, da es zu weit links liegt, vom Benutzer ausgeblendet werden kann und für jeden Benutzer einzeln eingeblendet werden muss. Diese Lösung hatte ich ihm bereits präsentiert. Auch die "tolle", funktionierende "zwei Zeichen je Icon"-Lösung fand bei ihm keine Gnade. Auch meine Lösung mit Überschreiben der Uhr mochte er nicht, da wohl ein paar Anwender allergisch reagieren, wenn sie "ihre" Uhr nicht mehr sehen... Icons kann man so einrichten, dass sie immer angezeigt werden, das ist also nicht mein Problem. Über TextTrayIcon1.Icon.Handle bzw. CoolTrayIcon1.Icon.Handle bekomme ich das Handle auf das Icon vom Typ HICON. Wie kann ich daraus die Position auf dem Desktop feststellen? In diesem Artikel ![]() |
Re: Icon im Tray (TNA) animieren bzw. ändern
Zitat:
|
Re: Icon im Tray (TNA) animieren bzw. ändern
Doch, das habe ich nämlich bereits programmiert. Alle Icons werden so sortiert, dass meine in der richtigen Reihenfolge stehen und zwar das letzte ganz rechts. Auch daran, dass neue Symbole auftauchen und wieder verschwinden können, habe ich bereits gedacht und meine Symbole werden notfalls neu angeordnet.
Das ist alles soweit gelöst, jetzt benötige ich nur noch deren Koordinaten auf dem Desktop... Geht nicht, gibt es bei mir nicht. :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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