Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Icon im Tray (TNA) animieren bzw. ändern (https://www.delphipraxis.net/147273-icon-im-tray-tna-animieren-bzw-aendern.html)

Peter Müller 4. Feb 2010 22:54


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,

MacGuyver 4. Feb 2010 23:12

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

Meta777 4. Feb 2010 23:22

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;

Peter Müller 7. Feb 2010 19:14

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.

Luckie 7. Feb 2010 19:17

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.

patti 7. Feb 2010 19:19

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. Hier im Forum suchenDeskband.

mfg

Peter Müller 7. Feb 2010 20:04

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 Icons in Win32 bekomme ich über die Funktion GetIconInfo zwar xHotspot und yHotspot, bin mir aber irgendwie nicht sicher, ob das die gesuchten Koordinaten sind. Vielleicht habe ich in dem etwas längeren Artikel auch die richtige Stelle überlesen...

Luckie 7. Feb 2010 20:08

Re: Icon im Tray (TNA) animieren bzw. ändern
 
Zitat:

Zitat von Peter Müller
Icons kann man so einrichten, dass sie immer angezeigt werden, das ist also nicht mein Problem.

Richtig, aber du hast auch keinen Einfluss darauf, wo die Icons in der TNA angezeigt werden. Noch mal, die TNA ist einfach nicht dafür gedacht Text anzuzeigen.

Peter Müller 7. Feb 2010 20:17

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 10:59 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