Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Aplicatii in Tray Icon Area

Informatica




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.

function c(dwMessage: DWORD;
lpData: PNotifyIconData): BOOL; stdcall;

      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.

type
TNotifyIconData = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array[0..63] of AnsiChar;
end;

cbSize 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.

type
TForm1 = class(TForm)
. . .
private
NotifyIconData: TNotifyIconData;
. . .
end;

      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
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
Menus, ShellAPI;

      Î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);
begin
with NotifyIconData do
begin
cbSize := sizeof(NotifyIconData);
Wnd := Handle;
uCallBackMessage := WM_USER + 1;
hIcon := Application.Icon.Handle;
StrPLCopy(szTip,
PChar('Mesaj afisat ca Hint'),
SizeOf(szTip));
// toate cele 3 campuri contin info valida
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
end;

Shell_NotifyIcon(NIM_ADD, @NotifyIconData)
end;

      Î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.

procedure TForm1.FormClose
(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIcon(NIM_DELETE, @NotifyIconData)
end;

      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.

type
TForm1 = class(TForm)
. . .
protected
procedure WndProc(var Msg: TMessage); override;
. . .
end;

          De asemenea în sectiunea implementation va trebui introdus si corpul procedurii dupa cum urmeaza:

procedure TForm1.WndProc(var Msg: TMessage);
var
p: TPoint;
begin
// se testeaza daca este mesaj primit
// de la TIA
case Msg.Msg of
WM_USER + 1:
// se testeaza ce eveniment
// de mouse este
case Msg.lParam of
WM_LBUTTONDBLCLK:
Optiuni1Click(nil);
WM_RBUTTONDOWN:

begin
GetCursorPos(p);
PopupMenu1.Popup(p.x, p.y);
end;
end;
end;
// se transfera controlul procedurii originale
// pentru tratarea celorlalte mesaje
inherited;
end;

      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).

procedure TForm1.Optiuni1Click(Sender: TObject);
begin
// cod ce doreste sa se execute la selectarea
// meniului Optiuni...
//din cadrul meniului derulant
end;

      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);
begin
Application.Terminate;
end;

Î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

Scoala2001@yahoo.com


Document Info


Accesari: 1579
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )