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 TTrayIcon mit overlay nummer bereits verfügbar? (https://www.delphipraxis.net/202281-ttrayicon-mit-overlay-nummer-bereits-verfuegbar.html)

KodeZwerg 16. Okt 2019 07:38

TTrayIcon mit overlay nummer bereits verfügbar?
 
Hallo liebe Delphianer,

ich habe versucht einem TTrayIcon beizubringen unterschiedliche Nummern raufmalen zu lassen.
Ich bin fürchterlich gescheitert, von daher meine Frage ob es so was schon gibt bzw sich jemand mit so etwas beschäftigt hat um vielleicht ein gemeinsames Projekt daraus zu entwickeln.
Mein Ansatz war es, transparente Icons mit Ziffern von 0-9 als Resource abzulegen.
Das gleich noch einmal mit den Anfangszahlen von 10-90 (also 1-9) nur halt an links versetzter Position.
Dann per Event das Original Icon puffern und die transparenten raufzukopieren/rüberzumalen.
Mein Ergebnis sah immer grausam und gequält aus.

Von daher meine zwei Fragen, gibt's sowas schon bzw hat wer lust mit mir so etwas zu entwerfen?

Auf die Idee dazu gekommen bin ich wegen einem Chat Programm was ins SysTray minimiert werden kann.
Wäre doch ein nettes schmankerl da Zahlen drauf zu haben für ungelesene Nachrichten.

Habt einen schönen Tag!

haentschman 16. Okt 2019 08:25

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...:P
...dieses Rad hat schon jemand erfunden...meinst du sowas? :wink:

Michael II 16. Okt 2019 08:40

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
KodeZwerg zeig doch mal deinen Code und v.a. auch deine Icons.

http://docwiki.embarcadero.com/CodeE...yIcon_(Delphi)

und vielleicht später #2 hast du ja sicher gelesen...

Uwe Raabe 16. Okt 2019 08:58

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Man müsste halt die bei Icons hinterlegte ImageList einmal mit den Icons 0..99 erzeugen und dann jeweils den IconIndex entsprechend setzen. Soll das Basis-Icon ausgetauscht werden, muss man das halt nochmal machen.

Schöner wäre sicher der Einsatz der Overlay-Funktionalität von TImageList, aber das wird zum Einen von TTrayIcon (Shell_NotifyIcon) nicht unterstützt und wäre zum Anderen auch auf 15 Overlays beschränkt.

KodeZwerg 16. Okt 2019 09:21

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo nochmal, vielleicht habe ich mich nicht genau genug ausgedrückt oder ich verstehe gerade nicht das Bild @ haentschman
Also das ich viele verschiedene Icons haben kann, das ist mir schon bewusst.
Ich hatte eher im Hinterkopf so etwas wie im Anhang.
Ein Icon was eine Nummer raufkopiert bekommt und nicht ein Icon in zig verschiedenen Ausführungen.

Meinen (dreckigen) Code lade ich morgen gerne hoch @ Michael II

Vielleicht kann man ja das Icon, nachdem es gepuffert wurde, Bildtechnisch mit einer Nummer ergänzen (das würde vielleicht diese unzugänglichkeit umgehen) @ Uwe Raabe

HolgerX 16. Okt 2019 15:27

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Hmm..

Bei D6 hatte ich das noch selber gemacht, deshalb meine Frage zum TTrayIcon von Emba:

Dies hat doch eine Property 'Icon', schon mal versucht ein selbst erstelltes Icon mit Overlay diesem zuzuweisen?
Ohne ImageList?

Der schöne Günther 16. Okt 2019 15:34

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Leicht off topic: Sind typische Icons da rechts unten nicht sowieso so klein dass man ein Zahlen-Overlay nicht vernünftig entziffern könnte? Alles was ich da unten rechts kenne stellt etwas "neues" mit einem roten Punkt dar, verzichtet aber darauf, da noch weitere Informationen unterzubringen.

PS: https://devblogs.microsoft.com/oldne...10-00/?p=42583

KodeZwerg 16. Okt 2019 15:46

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Zitat:

Zitat von HolgerX (Beitrag 1449776)
Hmm..

Bei D6 hatte ich das noch selber gemacht, deshalb meine Frage zum TTrayIcon von Emba:

Dies hat doch eine Property 'Icon', schon mal versucht ein selbst erstelltes Icon mit Overlay diesem zuzuweisen?
Ohne ImageList?

@holger, genau das tat ich, aber mein code (morgen zeig ich) versaut mehr das ergebnis anstelle das da was gutes rauskommt.

Zitat:

Zitat von Der schöne Günther (Beitrag 1449778)
Leicht off topic: Sind typische Icons da rechts unten nicht sowieso so klein dass man ein Zahlen-Overlay nicht vernünftig entziffern könnte? Alles was ich da unten rechts kenne stellt etwas "neues" mit einem roten Punkt dar, verzichtet aber darauf, da noch weitere Informationen unterzubringen.

PS: https://devblogs.microsoft.com/oldne...10-00/?p=42583

@günther ......hmmmm.... jo das ginge tatsächlich und vereinfacht alles enorm... der wunsch nach nummer bleibt dennoch erstmal vorhanden.... der gedanke an sich gefällt mir dennoch (wenn nichts klappt wirds so gemacht) guter tipp von Dir !

KodeZwerg 17. Okt 2019 07:13

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab was gebastelt was den Anschein hat zu funktionieren.
Das ganze basiert auf einer Projekt JEDI Methode.
Damit ist auch das 15 Bilder Overlay Limit gesprengt.

Im Anhang kleines Binary plus kompl. Source.

Zur Veranschaulichung hier der Haupt-Quelltext.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Forms, Controls, Classes, Graphics, StdCtrls, ExtCtrls, CommCtrl;
//  JclShell;

type
  TForm1 = class(TForm)
    TrayIcon1: TTrayIcon;
    CheckBox1: TCheckBox;
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    Image3: TImage;
    procedure FormShow(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  Image1.Picture.Icon := TrayIcon1.Icon;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  TrayIcon1.Visible := (Sender as TCheckBox).Checked;
end;

function OverlayIcon(var Icon: HICON; Overlay: HICON; Large: Boolean): Boolean;
// source aus JclShell.pas datei!!!
var
  Source, Dest: HIMAGELIST;
  Width, Height: Integer;
begin
  Result := False;
  if Large then
  begin
    Width := GetSystemMetrics(SM_CXICON);
    Height := GetSystemMetrics(SM_CYICON);
    Source := ImageList_Create(Width, Height, ILC_MASK or ILC_COLOR32, 1, 0);
  end
  else
  begin
    Width := GetSystemMetrics(SM_CXSMICON);
    Height := GetSystemMetrics(SM_CYSMICON);
    Source := ImageList_Create(Width, Height, ILC_MASK or ILC_COLOR32, 1, 0);
  end;
  if Source <> 0 then
  begin
    if (ImageList_AddIcon(Source, Icon) <> -1) and
      (ImageList_AddIcon(Source, Overlay) <> -1) then
    begin
      Dest := HIMAGELIST(ImageList_Merge(Source, 0, Source, 1, 0, 0));
      if Dest <> 0 then
      begin
        DestroyIcon(Icon);
        Icon := ImageList_ExtractIcon(0, Dest, 0);
        ImageList_Destroy(Dest);
        Result := True;
      end;
    end;
    ImageList_Destroy(Source);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Ico: HICON;
begin
  Ico := TrayIcon1.Icon.Handle;
  OverlayIcon(Ico, Image2.Picture.Icon.Handle, False);
  Image3.Picture.Icon.Handle := Ico;
  TrayIcon1.Icon.Handle := Ico;
  TrayIcon1.SetDefaultIcon;
end;

end.

Codehunter 18. Okt 2019 07:00

AW: TTrayIcon mit overlay nummer bereits verfügbar?
 
Also ich hab sowas ähnliches vor vielen Jahren auch mal gemacht. Zwar nicht mit Zahlen sondern mit Symbolen aber ist ja egal. Dabei habe ich die Icons in der ImageList zur Laufzeit selbst generiert. Erst in einem TBitmap (Canvas) gezeichnet und dann dynamisch zur ImageList hinzugefügt. Leider finde ich das Projekt nicht mehr...

Bei Windows 10 gibt es auch noch etwas neues neben der TNA (früher mal "DNU" genannt ^^), wo der Button vom Benachrichtigungscenter eingebettet ist. Zwischen Uhr und Aeropeek-Button. Würde mich mal interessieren, ob man da auch eigene Anwendungen rein bekommt. Also nicht ins Benachrichtigungscenter sondern in diesen Buttonbereich der Taskleiste. Weil da gehen größere Symbole, nicht nur 16x16.


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