Migająca ikona w trayu

Britney Spears

Witam!
Kiedyś potrzebowałem ikonki w trayu, która będzie migać, zatrzyma się, wznowi miganie, utworzy się na pasku lub zniknie z niego. No więc przedstawiam tu bardzo prostą metodę na te wszystkie opcje. Jest to banalna rzecz, ale bardzo przydatna:)

Potrzebne nam będą:

  • 5 Buttonów
  • 1 PopupMenu
  • 1 Timer

Button1 - dodaje ikonkę do traya
Button2 - usuwa ikonkę z traya
Button3 - zamyka program
Button4 - przerywa miganie ikonki
Button5 - wznawia miganie ikonki
Timer1 - kod do migania ikonką (Interval:=500;)
PopupMenu - opcja z wyjściem z programu

Oto cały kod

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, shellapi, ExtCtrls;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Wyjd1: TMenuItem;
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    Button4: TButton;
    Button5: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Wyjd1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    procedure WndProc(var Msg : TMessage); override;
  public
    IconNotifyData : TNotifyIconData;
  end;

var
  Form1: TForm1;
  migacz:integer; //zmienna migania ikonki

implementation

{$R *.dfm}

//Kliknij dwukrotnie na Button1
procedure TForm1.Button1Click(Sender: TObject);
begin
  // Teraz wypełniamy rekord IconNotifyData tak aby przyjmował
  // komunikaty wysyłane do aplikacji i pokazywał "dymki" podpowiedzi.
  with IconNotifyData do begin
    hIcon:=Application.Icon.Handle;
    uCallbackMessage:=WM_USER+1;
    cbSize:=SizeOf(IconNotifyData);
    Wnd:=Handle;
    uID:=100;
    uFlags:=NIF_MESSAGE+NIF_ICON+NIF_TIP;
  end;
  // Kopiujemy tytuł aplikacji jako "dymek"
  StrPCopy(IconNotifyData.szTip, Application.Title);

  // Dodajemy ikonę do traya
  Shell_NotifyIcon(NIM_ADD,@IconNotifyData);
end;
procedure TForm1.WndProc(var Msg : TMessage);
var
  p : TPoint;
begin
 if (Msg.Msg=WM_USER+1)and(Msg.lParam=WM_RBUTTONDOWN) then
 begin
  GetCursorPos(p);
  PopupMenu1.Popup(p.x, p.y);
 end;
 if (Msg.Msg=WM_USER+1)and(Msg.lParam=WM_LBUTTONDOWN) then
 begin
  form1.show;
  showwindow(handle,sw_normal);
 end;
 inherited;
end;

//Kliknij dwukrotnie na PopupMenu, potem w Caption wpisz
//Wyjdź i wklej ten kod
procedure TForm1.Wyjd1Click(Sender: TObject);
begin
 Shell_NotifyIcon(NIM_DELETE, @IconNotifyData);
  Application.ProcessMessages;
  Application.Terminate;
end;

//Kliknij dwukrotnie Button2 i wklej ten kod
procedure TForm1.Button2Click(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @IconNotifyData);//kasuje ikonkę z traya
end;

//Kliknij dwukrotnie Button3 i wklej ten kod
procedure TForm1.Button3Click(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @IconNotifyData);
  Application.ProcessMessages;
  Application.Terminate;
end;

//Kliknij dwukrotnie Timer1 i wklej ten kod
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(migacz);
 if migacz>1 then migacz:=0;
 if migacz=0 then button1.Click;
 if migacz=1 then button2.Click;
 //procedurka od migania ikonką
end;

//Kliknij dwukrotnie na Button4 i wklej to
procedure TForm1.Button4Click(Sender: TObject);
begin
timer1.Enabled:=false;//przerywa miganie
button1.Click;
end;

//Kliknij dwukrotnie na Button5 i wklej to
procedure TForm1.Button5Click(Sender: TObject);
begin
timer1.Enabled:=true; //wznawia miganie
end;

end.

Skompiluj to teraz i sprawdź jak to działa.
Myślę, że z kodem nie będzie kłopotów i z jego zrozumieniem. Przykład bardzo prosty jak wykonać miganie ikonki. Załączam jeszcze źródło jakby ktoś sobie nie poradził.

Pozdrawiam :)

15 komentarzy

O LOL, to ja pisałem? :D Masakra jaki polew mam teraz z tego hehe. :) Wygląda to naprawdę komicznie na dziś dzień. :)

UNFA@wp.pl:
http://www.unfa.prv.pl - mówisz??
Coś długo się wczytuje...
Szczególnie menu...
Więc wszedłem na index2.html...
Dużo programów nawaliłeś... ...ale to ma być klasa A
Notatnik? Płonięcie?
Może być 4/5 a Art. 3,5/5

czy to aby nie gotowiec??

z tym miganiem to w windowsie XP trochę bałaganu robi

YEAH!!!!!!!!!
Tego zawsze potzebowałem!!
<a href="http://www.unfa.prv.pl">Zapraszam na moją stronkę</a>

a ja nie wiem po co się tak bawić :/
ściągasz CHpack .. tam masz tray icon co to i siędodaje i możesz ustawić czy ma się program pokazać po kliknięciu czy po DlbClick .. miganie to też ma, ustawić można enabled'a i popupa dodać .. ale pewnie mi powiecie że leń jestem :)
muahahaha :D pozdro!

no przenieś to wreszcie do gotowców albo do faq! i popraw błędy (NIM_MODIFY + uwagi Adamo)! bo usuniemy!

tak w ogóle to precz z tym do faq.

Można to też na bulinku zrobić ale można i też w taki niekonwencjonalny, jaki pokazałem :P Może to będzie łatwiesze do zrozumienia dla początkujących :)
Drajwer ja wiem co to jest boolean koleś :]

nie wiem jak to ma wyglądać, ba nawet nie cyztałem przeleciałem wzrokiem tylko, ale żeby migotało można ustawić parametr w TTray.animate na true;

if migacz=0 then button1.Click;
if migacz=1 then button2.Click;

albo...

TButton(FindComponent('Button'+inttostr(migacz+1))).Click; :P

koles wiesz co to sa booleany? :P

To chyba powinno się znaleźć w Gotowcach

no fakt.. to miganie jest wrecz zabawne :D

ja bym jednak zrobił podmianę ikonki, bo dodawanie i usuwanie dziwnie wygląda :)

inc(migacz);
if migacz>1 then migacz:=0;
if migacz=0 then button1.Click;
if migacz=1 then button2.Click;

a nie lepiej, migacz jako boolean i dać tak:

migacz:=not migacz;
if migacz then button1.Click else button2.Click;
?