Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TrayIcon zur Laufzeit ändern (Canvas?, BMP -> ICO?) (https://www.delphipraxis.net/142515-trayicon-zur-laufzeit-aendern-canvas-bmp-ico.html)

Lumpiluk 29. Okt 2009 16:07


TrayIcon zur Laufzeit ändern (Canvas?, BMP -> ICO?)
 
Hallo!

Momentan bin ich dabei, eine Binäruhr als Desktopapplikation zu programmieren. Für Optionen etc. wird es nicht in der Taskleiste sondern im Tray angezeigt. Da es bei einer Uhr jetzt aber praktisch wäre, wenn man die Zeit auch bei geöffneten Fenstern lesen kann (gut, bei einer Binäruhr jetzt nicht unbedingt; vor Allem, wenn fast direkt daneben die Windows-Uhr ist... aber es würde auch besser aussehen), möchte ich sie im Trayicon dynamisch anzeigen.
Ich habe schon versucht, sie in ein TImage zu zeichnen, zu speichern und als Icon wieder zu laden - geht natürlich nicht, weil als Bitmap gespeichert wird und als *.ico geladen :?

Gibt es eine Möglichkeit, Bitmaps zu Icons zu konvertieren (habe nur welche in die andere Richtung gefunden) oder kann ich auch anders auf das Canvas des TrayIcons zeichnen?

DeddyH 29. Okt 2009 16:22

Re: TrayIcon zur Laufzeit ändern (Canvas?, BMP -> ICO?)
 
Such mal nach Hier im Forum suchenBmp2Ico.

Lumpiluk 29. Okt 2009 16:43

Re: TrayIcon zur Laufzeit ändern (Canvas?, BMP -> ICO?)
 
Ach, danke!
Peinlich, dass ich nicht noch zuerst hier gesucht habe... :oops:

Das Icon wird erfolgreich erstellt (Testweise habe ich auch mal speichern lassen), aber leider erscheint es immernoch nicht im Tray.

Delphi-Quellcode:
function CreateIconFromBmp(Bmp: TBitmap): TIcon; //aus der DP ;)
begin
  with TImageList.CreateSize(Bmp.Width, Bmp.Height) do
  try
    {$IFDEF VER90}
    with Bmp do AddMasked(Bmp, Canvas.Pixels[Width-1, Height-1]);
    {$ELSE}
    AddMasked(Bmp, Bmp.TransparentColor);
    {$ENDIF}
    Result := TIcon.Create;
    GetIcon(0, Result);
  finally
    Free;
  end;
end;

procedure TForm1.IconTmrTimer(Sender: TObject);
var
  I,J: Integer;
begin
  Image1.Picture.Bitmap.Canvas.Brush.Color := clblue;
  Image1.Picture.Bitmap.Canvas.FillRect(rect(0,0,16,16));
  for I := 0 to 5 do
  begin
    for J := 0 to 3 do
    begin
      if ClockForm.BinLights[I].Lights[J] = True then
      begin
        Image1.Picture.Bitmap.Canvas.Pixels[I*2+1,J*2+1] := clLime;
      end;
    end;
  end;
  TmpIcon.Free;
  TmpIcon := CreateIconFromBmp(Image1.Picture.Bitmap);
  TmpIcon.SaveToFile('tmpIcon.ico'); //Öffnen mit anderen Programmen klappt ohne Probleme

  Fillchar(NotifyIconData,Sizeof(NotifyIconData),0); //dieser Abschnitt wird auch schon im OnCreate aufgerufen. Danach bleibt das Icon im Tray transparent
  NotifyIconData.cbSize := Sizeof(NotifyIconData);
  NotifyIconData.Wnd   := Handle;
  NotifyIconData.uFlags := NIF_MESSAGE
    or NIF_ICON
    or NIF_TIP;
  NotifyIconData.uCallbackMessage := WM_TASKABAREVENT;
  //NotifyIconData.hIcon := Application.Icon.Handle;
  NotifyIconData.hIcon := TmpIcon.Handle;
  NotifyIconData.szTip := 'BinaryClock';
  Shell_NotifyIcon(NIM_ADD, @NotifyIconData);          
end;

DeddyH 29. Okt 2009 16:48

Re: TrayIcon zur Laufzeit ändern (Canvas?, BMP -> ICO?)
 
Muss es nicht auch
Delphi-Quellcode:
Shell_NotifyIcon(NIM_MODIFY, @NotifyIconData);
heißen?

Lumpiluk 29. Okt 2009 16:52

Re: TrayIcon zur Laufzeit ändern (Canvas?, BMP -> ICO?)
 
Danke, klappt perfekt!
Ich glaube, heute ist nicht mein Tag :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 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