|
Aplicatii in Tray Icon Area
Pe parcursul acestui articol sper ca veti gasi
raspunsul dorit la aceasta întrebare cel putin din punctul de vedere al
implementarii în Delphi.
Aspecte generale
Pentru cine înca nu stie la ce se refera
subiectul articolului de fata voi încerca sa fac o succinta prezentare a
problemei. Tray Icon Area sau Tray Notification Area se refera la acea zona din
coltul din dreapta jos a ecranului Windows-ului, zona în care sunt afisate de
regula o serie de iconite de dimensiune redusa (16 x 16 pixeli) si ora
sistemului. Mai corect spus Tray Icon Area apartine TaskBar-ului Windows, asa
ca în cazul în care ati repozitionat TaskBar-ul în alta zona a ecranului, si
pozitionarea TIA se va modifica în consecinta.
Probabil cel mai cunoscut program de acest
gen este Volum Control-ul furnizat chiar de Windows. Daca aveti instalata în
sistem o placa de sunet si ati activat optiunea Show volum control in taskbar
din Control Panel|Multimedia cu siguranta veti putea vedea în TIA acel difuzor
galben de dimensiuni reduse prin intermediul caruia puteti regla volumul
sonorului. Alte aplicatii cunoscute implementate în aceeasi maniera sunt
programele de tip pager cum ar fi: ICQ, Yahoo! Messenger, AOL Instant
Messenger 17517q1616r , MSN Messenger, etc. Caracteristica generala a tuturor acestor
programe este aceea ca ele ruleaza în background putând fi apelate rapid prin
intermediul iconitei afisate în cadrul TIA.
Cum implementeaza Windows-ul Tray Icon
Area
Ca de obicei, atunci când dorim sa
implementam functionalitati apropiate de intimitatea functionarii sistemului de
operare va trebui mai întâi sa studiem cum rezolva aceste probleme Windows-ul
însusi si ce furnizeaza spre utilizare prin interfata programabila API.
În cazul de fata tot ceea ce ne va pune la
dispozitie Windows API va fi doar o functie si o structura de date de tip
înregistrare sau articol (record). Sa fie prea mult? Sa fie prea putin? Cu
siguranta, va veti convinge ca e suficient. Numele functiei amintite este
Shell_NotifyIcon si o vom discuta pe scurt în continuare, pentru mai multe
amanunte fiind recomandata utilizarea help-ului API de care dispuneti dupa
instalarea mediului Delphi.
Primul parametru (dwMessage) se refera la operatia pe care doriti sa o faceti cu privire la icoana ce apare în TIA, si anume aveti trei posibilitati: sa adaugati o icoana, sa modificati o icoana deja afisata sau sa stergeti o icoana afisata. Pentru fiecare dintre cele trei posibilitati exista definita câte o constanta simbolica, fiecare dintre ele fiind prezentata în tabelul urmator.
Constanta |
Valoare |
Explicatie |
NIM_ADD |
Adaugare icoana |
|
NIM_MODIFY |
Eliminare icoana din TIA |
|
NIM_DELETE |
Modificare icoana existenta (afisata deja) |
Cel de al doilea parametru (lpData) este un pointer la o structura de tip TNotifyIconData. Dupa cum probabil va imaginati aceasta este structura de date amintita mai devreme si evident ca o vom discuta în amanunt în cele ce urmeaza. Pentru început sa vedem cum este definita aceasta structura si ce semnificatie are fiecare câmp al acesteia.
typecbSize are ca scop furnizarea dimensiunii în octeti a întregii structuri. Având însa în vedere faptul ca a aceasta structura este de lungime fixa si cunoscuta nu este prea clar de ce aceasta trebuie furnizata. Oricum, nu aveti altceva de facut decât sa îl initializati cu valoarea SizeOf(TNotifyIconData) înainte de utilizarea structurii.
Wnd se refera la handler-ul ferestrei ce va trata evenimentele (mesajele) provenite ca urmare a unei actiuni ce are loc asupra icoanei afisate în Tray Icon Area. Unicele actiuni ce pot fi realizate asupra iconitelor din TIA sunt cele facute utilizând mouse-ul.
uID este un numar unic utilizat pentru a putea deosebi între mai multe iconite în cazul în care o aceeasi fereastra va avea mai multe icoane afisate în cadrul TIA.
uFlags are ca scop informarea Windows-ului cu privire la care dintre urmatoarele sau ultimele 3 câmpuri ale structurii (uCallbackMessage, hIcon, szTip) are un continut valid în momentul apelului functiei Shell_NotifyIcon. Acest câmp poate lua ca valori oricare din cele 3 constante din tabelul urmator, precum si combinatii ale acestora, în cazul în care 2 sau chiar toate trei câmpurile de configurare contin informatie valida. Fiind vorba de operatii pe biti operatorul utilizat pentru combinarea valorilor va fi or.
Constanta |
Valoare |
Explicatie |
NIF_MESSAGE |
uCallbackMessage contine informatie valida |
|
NIF_ICON |
hIcon contine informatie valida |
|
NIF_TIP |
szTip contine informatie valida |
uCallbackMessage reprezinta identificatorul mesajului ce va fi trimis înapoi de Windows ferestrei specificate prin intermediul câmpului Wnd, în momentul în care se va realiza o actiune asupra iconitei afisate în TIA. În mod uzual, acest mesaj se defineste prin adaugarea unei valori la WM_USER.
hIcon se refera la handler-ul icoanei ce se doreste a fi afisata în cadrul TIA.
szTip este un si de caractere terminat cu #0 si contine mesajul ce va fi afisat la stationarea cu mouse-ul deasupra iconitei din TIA.
Înainte de a
trece la implementarea în Delphi ar mai trebui explicat un singur lucru si
anume ce va contine mesajul trimis înapoi de Windows. Ca orice mesaj Windows si
acesta va avea ca parametrii wParam si lParam. În cazul de fata însa wParam va
contine uID-ul iconitei ce sta la originea transmiterii mesajului, iar lParam
va contine mesajul de mouse generat (WM_LBUTTONDOWN, WM_LBUTTONDBLCLK si
WM_RBUTTONDOWN).
In principiu, în acest moment avem cam toate
informatiile necesare pentru a putea implementa o aplicatie în Tray
Notification Area. Asa ca va invit sa încercam împreuna.
Implementarea în Delphi
Pentru început este de preferat sa creati un
nou proiect si sa definiti în sectiunea private a obiectului TForm1 un câmp
NotifyIconData de tip TNotifyIconData.
Trebuie amintit faptul ca atât functia Shell_NotifyIcon cât si tipurile de date TNotifyIconData si PNotifyIconData sunt definite in unit-ul ShellAPI. Astfel, pentru a putea fi utilizate, va trebui sa adaugati acest unit la lista prezenta în clauza uses.
usesÎn continuare vom introduce pe evenimentul onCreate al formei principale a aplicatiei (TForm1) secventa de cod urmatoare pentru a initializa structura de date NotifyIconData si pentru a afisa apoi iconita în TIA. În lipsa altei iconite putem utiliza pentru început chiar icoana aplicatiei.
procedure TForm1.FormCreate(Sender: TObject); În prima parte a
procedurii am initializat fiecare câmp al structurii NotifyIconData iar în
finalul acesteia am apelat functia Shell_NotifyIcon cu parametrii NIM_ADD
(adaugare icoana în TIA) si adresa structurii NotifyIconData . Operatorul @ se
foloseste în scopul furnizarii adresei de memorie a unei variabile. De
asemenea, ca valoare a identificatorului de mesaj ce va fi întors de Windows am
folosit WM_USER + 1.
Întru-cât dorim ca la terminarea executiei
programului iconita asociata sa nu mai fie afisata va trebui sa introducem
codul aferent eliminarii acesteia din TIA pe evenimentul onClose al formei
principale a aplicatiei.
Daca veti rula
aplicatia în aceasta faza veti pute deja vedea cum iconita va aparea la
lansarea programului si cum va disparea la terminarea executiei acestuia. Mai
mult, la stationarea cu mouse-ul deasupra iconitei va fi afisat si mesajul
"Mesaj afisat ca Hint". În afara de aceasta nu exista însa înca
implementata nici o alta alta functionalitate.
Pentru a putea trata evenimentele transmise
de Windows ca urmare a unei actiuni cu mouse-ul în aria de acoperire a iconitei
va trebui sa rescriem metoda WndProc a formei (ferestrei) principale a
aplicatiei. Astfel va trebui sa introduceti declaratia procedurii în sectiunea
protected a obiectului TForm1, exact cum este prezentat mai jos.
De asemenea în sectiunea implementation va trebui introdus si corpul procedurii dupa cum urmeaza:
procedure TForm1.WndProc(var Msg: TMessage);
|
Am mai
considerat ca în cadrul formei principale a fost adaugat o componenta de tip
PopupMenu pentru care au fost definite patru optiuni si anume: Start, Stop,
Optiuni... si Iesire, cea de a treia fiind implicita (Optiuni1.Default a fost
setat la valoarea True). Functia GetCursorPos furnizeaza cordonatele mouse-ului
pe ecran la momentul apelului functiei.
Codul de mai jos va fi executat atât ca
urmare a selectarii meniului Optiuni... din cadrul meniului derulant cât si ca
urmare a realizarii unui dubluclick pe iconita din cadrul TIA. Acesta din urma
se datoreaza apelului procedurii Optiuni1Click la tratarea evenimentului
WM_LBUTTONDBLCLK (vezi procedura WndProc).
Codul aferent optiunii Iesire din cadrul meniului derulant poate fi cel prezentat în continuare. Avantajul apelului metodei Terminate a obiectului Application fiind acela ca aplicatia nu se va inchide imediat ci dupa procesarea tuturor mesajelor ce îi sunt adresate.
procedure TForm1.Iesire1Click(Sender: TObject); În cadul imaginii alaturate puteti observa
iconita aplicatiei (ultima din Tray Icon Area) precum si meniul derulant afisat
ca urmare a realizarii unui click cu butonul drept al mouse-ului pe icoana
aplicatie.
Ar mai fi si alte aspecte de discutat,
precum modificarea icoanei afisate sau si mai interesant cum pot fi implemetate
iconitele animate. Lipsa de timp însa pune capat, fara mila, elanului meu, ca
de altfel de fiecare data... Totusi îmi voi mai îngadui câteva cuvinte în
încheiere...
În incheiere
Sfatul meu este sa nu folositi în mod extensiv acest tip de aplicatii ele fiind de regula consumatoare de resurse sistem. În alta ordine de idei este bine sa va gânditi de doua ori înainte de a lua decizia de a implementa un program în Tray Icon Area încercând sa analizati cât mai obiectiv care ar fi necesitatile ce ar conduce la o astfel de abordare a problemei. În concluzie, nu faceti lucruri doar pentru simplul motiv ca se pot face si nu implementati acest gen de aplicatii doar de dragul de a vedea o iconita în plus în Tray Icon Area.
ScoalaOnline
|