REFERAT INFORMATICA | Aplicatii in Tray Icon Area

Publicat de: Madalina Marcu

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

ConstantaValoareExplicatie
NIM_ADD0Adaugare icoana
NIM_MODIFY1Eliminare icoana din TIA
NIM_DELETE2Modificare 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.

ConstantaValoareExplicatie
NIF_MESSAGE0uCallbackMessage contine informatie valida
NIF_ICON2hIcon contine informatie valida
NIF_TIP4szTip 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.
 

NOTA IMPORTANTA:
 ARTICOLELE PUBLICATE IN PAGINA DE REFERATE AU SCOP DIDACTIC SI SUNT ELABORATE IN URMA UNEI DOCUMENTARI SUSTINUTE. ESTE STRICT INTERZISA PRELUAREA ARTICOLELOR DE PE SITE SI PREZENTAREA LOR LA ORELE DE CURS. Referatele din aceasta sectiune sunt trimise de diferiti colaboratori ai proiectului nostru. Referatele va sunt prezentate pentru COMPLETAREA STUDIULUI INDIVIDUAL, si va incurajam si sustinem sa faceti si voi altele noi bazate pe cercetari proprii.

REFERAT FIZICA | Telescopul optic

REFERAT FIZICA | Telescopul optic

REFERAT FIZICA | Cuptor cu creuzet pentru topire Al

REFERAT FIZICA | Cuptor cu creuzet pentru topire Al

REFERAT FIZICA | Influenta factorilor fizici

REFERAT FIZICA | Influenta factorilor fizici

REFERAT FIZICA | OCHIUL OMENESC – APARAT OPTIC

REFERAT FIZICA | OCHIUL OMENESC – APARAT OPTIC

REFERAT FIZICA | CONDENSATOARE ELECTROLITICE

REFERAT FIZICA | CONDENSATOARE ELECTROLITICE

REFERAT FIZICA | Iluzii optice

REFERAT FIZICA | Iluzii optice

REFERAT FIZICA | Istoria telescopului

REFERAT FIZICA | Istoria telescopului

REFERAT FIZICA | Instrumente optice specializate

REFERAT FIZICA | Instrumente optice specializate

REFERAT FIZICA | Un atom in spatiu

REFERAT FIZICA | Un atom in spatiu

REFERAT FIZICA | Instalatii electrocasnice

REFERAT FIZICA | Instalatii electrocasnice

REFERAT FIZICA | Lasere

REFERAT FIZICA | Lasere

REFERAT FIZICA | Energia eoliana

REFERAT FIZICA | Energia eoliana

REFERAT FIZICA | Calorimetrie

REFERAT FIZICA | Calorimetrie

REFERAT FIZICA | Avioanele

REFERAT FIZICA | Avioanele

REFERAT FIZICA | Despre seisme si consecintele lor

REFERAT FIZICA | Despre seisme si consecintele lor

REFERAT FIZICA | Executarea bransamentelor aeriene

REFERAT FIZICA | Executarea bransamentelor aeriene

REFERAT FIZICA | Principiul conservarii energiei

REFERAT FIZICA | Principiul conservarii energiei

REFERAT FIZICA  |Fotonul | Efectul fotoelectric

REFERAT FIZICA |Fotonul | Efectul fotoelectric

REFERAT FIZICA | Bomba cu neutroni

REFERAT FIZICA | Bomba cu neutroni

REFERAT FIZICA | Telefonul | Alexander Graham Bell

REFERAT FIZICA | Telefonul | Alexander Graham Bell

REFERAT FIZICA | Poluarea sonora

REFERAT FIZICA | Poluarea sonora

REFERAT FIZICA | TIPURI DE BAROMETRE

REFERAT FIZICA | TIPURI DE BAROMETRE

REFERAT FIZICA | STUDIUL TENSIUNII SUPERFICIALE A LICHIDELOR

REFERAT FIZICA | STUDIUL TENSIUNII SUPERFICIALE A LICHIDELOR

REFERAT FIZICA | Studiul efectului Seebeck

REFERAT FIZICA | Studiul efectului Seebeck

REFERAT FIZICA | DETERMINAREA COEFICIENTULUI DE VÂSCOZITATE AL UNUI LICHID CU VÂSCOZIMETRUL OSTWALD

REFERAT FIZICA | DETERMINAREA COEFICIENTULUI DE VÂSCOZITATE AL UNUI LICHID CU VÂSCOZIMETRUL OSTWALD

REFERAT FIZICA | Determinarea vitezei sunetului

REFERAT FIZICA | Determinarea vitezei sunetului

REFERAT FIZICA | Studiul propagarii caldurii

REFERAT FIZICA | Studiul propagarii caldurii

REFERAT FIZICA | Determinarea constantei Boltzmann

REFERAT FIZICA | Determinarea constantei Boltzmann

REFERAT FIZICA | Proiect “Automat de impachetat chibrituri”

REFERAT FIZICA | Proiect “Automat de impachetat chibrituri”

REFERAT FIZICA | Redresarea curentului alternativ

REFERAT FIZICA | Redresarea curentului alternativ

REFERAT FIZICA | Amplificarea

REFERAT FIZICA | Amplificarea

REFERAT FIZICA | Undele mecanice

REFERAT FIZICA | Undele mecanice

REFERAT FIZICA | Ultrasunetele

REFERAT FIZICA | Ultrasunetele

REFERAT FIZICA | Comanda releului prin calculator

REFERAT FIZICA | Comanda releului prin calculator

REFERAT FIZICA | Marie Curie si Pierre Curie

REFERAT FIZICA | Marie Curie si Pierre Curie

REFERAT FIZICA | ALBERT EINSTEIN

REFERAT FIZICA | ALBERT EINSTEIN

Filozofie

Filozofie

Geografie

Biologie de clasa 6

Lectie virtuala Drept

S-ar putea sa iti placa…

I. L. Caragiale | In vreme de razboi

Nuvela „În vreme de război” apărută în 1898 este o operă realistă cu adănci ecouri din sfera naturalismului.Tema acestei excelente nuvele desi autorul o subtitulase „Schită” este obsesia.Hangiul Stavrache, mostenitorul fratelui său, preotul Iancu din Podeni, plecat pe...

I. L. Caragiale | Nuvelele lui Caragiale | In vreme de razboi

Nuvelele lui Caragiale pun în lumină un Caragiale cu totul nou, diferit de marele dramaturg, atât de bine înzestrat pentru comic în comediile sale. În nuvele Caragiale se dovedeşte a fi un foarte bun analist al stărilor obscure ale subconştientului. Deci suntem în...

I. L. Caragiale | In vreme de razboi

Alaturi de Ioan Slavici, Caragiale este in literatura noastra creatorul nuvelei realist psihologice. Universului comic din piesele de teatru si schite i se substituie in nuvela “In vreme de razboi” dimensiunea tragica a existentei umane.Tema nuvelei este obsesia....