Programowanie w języku Delphi » Artykuły

Migająca ikona w trayu

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

Britney Spears 2007-10-16 21:42

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

aroso 2005-11-22 08:56

czy to aby nie gotowiec??

voldenet 2005-05-31 01:29

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

YokTu-Ki 2004-09-28 19:52

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!

ŁF 2004-11-29 18:45

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

ŁF 2004-09-26 16:45

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

Britney Spears 2004-09-25 14:02

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ś :]

Seigba 2004-09-23 23:01

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;

Drajwer 2004-09-23 22:23

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

Cool_Programming 2004-09-23 19:58

To chyba powinno się znaleźć w Gotowcach

czarownik 2004-09-23 16:59

no fakt.. to miganie jest wrecz zabawne :D

AklimX 2004-09-22 16:02

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

Adamo 2004-09-22 13:43

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

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

<quote>
migacz:=not migacz;
if migacz then button1.Click else button2.Click;
</quote> ?