Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Introducere in programarea Windows
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

m5f19fp


Orice programator simte nevoia de la un punct in colo sa scrie o functie in plus pentru a sustine o interfata grafica a aplicatiei (GUI). Windows 3.x permite scrierea acestei interfete.
Elemente ca butoane, icoane, bare de defilare, deschidere de ferestre, operarea cu ajutorul mouse-ului sunt destinate tocmai realizarii de interfete.
Windows are reputatia de a fi usor pentru utilizatori si greu pentru programatori.
Acesta deoarece aplicatiile Windows folosesc concepte si mecanisme deosebite de programarea in DOS. Nu se poate scrie o aplicatie DOS si folosi citeva functii
Windows pentru grafica. Trebuie inteles ca optiunea pentru scrierea aplicatiei sub Windows implica intreaga functionare sub Windows.
Programele clasice sunt interpretate secvential. Programele Windows sunt puse in miscare de informatie, deci ele functioneaza cu totul diferit decit programele secventiale. Fiecare aplicatie este compusa dintr-o multitudine de componente singulare, fiecare dintre acestea reprezentind o functie bine definita.
Aici se creaza informatii fie printr-o functie partiala a programului, fie printr-un eveniment din afara (clik pe mouse, apasarea pe o tasta, starea imprimantei, etc.).
Acestea trebuie sa provoace o anumita reactie a functiilor de care apartine. De aceea nu se poate determina cu exactitate modul de derulare al unui astfel de program.
Daca, spre exemplu, cursorul mouse-ului s-a pozitionat undeva pe ecran si a fost apasata o tasta a mouse-ului, un handler de evenimente determina cind si unde s-a intimplat, gaseste functia de care apartine si-i preda mesajul corespunzator. Functia reactioneaza la informatie in mod individual si transmite programului parinte un mesaj de terminare (rezolvare). Acest mecanism se repeta intr-o bucla infinita. Iesirile pe ecran generate de toate programele Windows sunt de natura grafica.
Acest fapt cere un cu totul alt mod de gindire, mai ales pentru cei care au programat pina acum orientat caracter. Iesirile grafice pot fi puncte singulare, cercuri, dreptunghiuri, linii sau poligoane. Dar si afisarea textelor se va face in mod grafic. Astfel s-a usurat folosirea comuna in aplicatii a textului cu grafica. Tratarea textului pierde din confort, dar avantajele obtinute sunt acoperitoare.
Pentru ca utilizatorul sa se ocupe cit mai putin de detaliile interne ale iesirilor grafice, Windows ii pune la dispozitie un GDI (Graphic Develop ment Interface ). Cu acestea pot fi reprezentate elementele grafice cele mai utilizate. Graficele obtinute pot fi dependente sau independente de contextul iesirii. Deci cu acelasi apel al functiei "Rectangle" se poate afisa un dreptunghi atit pe ecran cit si la imprimanta. Din punct de vedere al utilizatorului iesirea pe ecran poate fi identica cu cea de la inprimanta (WYSIWYG).
Pentru a putea realiza aceasta unitate Windows necesita unitati inteli gente, care pot reprezenta toate elementele sustinute de GDI. Aceste unitati se denumesc drivere. Ele declanseaza iesirea grafica propriu-zisa. GDI-ul recunoaste patru unitati: ecranul, aparatele hardcopy cum ar fi imprimanta si plotter-ul, bit-map-uri si metafisiere.
Ecranele si imprimantele sint echipamente fizice, care redau imaginile in mod optic. Celelalte doua: bitmap-urile si metafisierelesint pseudounitati.
Ele permit memorarea imaginilor in memoria de lucru sau pe harddisk.




Interfata grafica a aplicatiei

Este o zona rectangulara pe ecran numita fereastra aplicatiei care la rindul ei cuprinde alte zone -ferestre specifice -numite ferestre de control
(controale). Acestea pot fi butoane de apasare, bare de defilare, meniuri,etc.
Pentru afisarea acestora pe ecran, programul aplicatiei trebuie sa coopereze strins cu nucleul Windows. Oricarei aplicatii de sub Windows ii este subordonata o fereastra grafica. Ea consta din doua zone distincte: zona non-client, care este gestionata de obicei de sistem si poate cuprinde un chenar activ (border resizeble), care prin "tragere" rescaleaza fereastra precum si un antet pe care e afisat de obicei numele aplicatiei si de care daca se "trage " se muta fereastra aplicatiei oriunde pa ecran. Acest antet mai poate cuprinde trei controale specifice
-Sistem meniu (meniu scurt cu functii de interfata cu Windows)
-buton de maximizare (ferastra va acoperi tot ecranul)
-buton de minimizare(fereastra revine la marimea normala daca era maximizata sau devine icoana-o reprezentare grafica restrinsa a aplicatiei).
Restul suprafetei ferestrei se numeste zona client si aici se manifesta cu precadere functiile specifice aplicatiei. Originea sistemului de coordonate este definita astfel incit in coltul din stinga sus sa se afle domeniul client.
Concomitent un mecanism de siguranta vegheaza, ca fereastra sa nu incalce o alta fereastra si invers. Inseamna ca obiectele grafice care depasesc marginea ferestrei vor fi taiate automat. Citeva din elementele interfetei sint exemplificate in figura urmatoare.

Meniu sistem Bara de titlu
ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
³A ³ ³\/³/\³ Butoane de minimizare/maximizare
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ _File _Edit _Search _Help ³ Meniul si submeniurile
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa aplicatiei
³ ³_Find ... ³ ³/\A Buton defilare verticala sus
³ ³ Find _Next F3³ AAAa
³ AAAAAAAAAAAAAAAÙ ³ A Cursor de defilare verticala
³ AAAa
³ ³ ³
³ ³ ³
³ ³ ³
³ Fereastra de lucru ³ ³
³ ³ A Bara de defilare verticala
³ ³ ³
³ ³ ³
³ AAAa
³ Cursor de defilare orizontala ³\/A Buton defilare vericala jos
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³< ³ ³ ³ >³ A Chenar de redimensionare
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ
Buton Bara de defilare orizontala Buton defilare orizontala stinga defilare orizontala dreapta

fig 1 - Componentele interfetei Windows

Obiectele interfetei utilizator marcheaza pe ecran un domeniu din care utilizatorul poate sa-si rezolve intrarile. Ele pot fi: ferestre, meniuri,icon-uri si boxe de dialog. Windows sprijina programatorul cu functii predefinite, astfel incat efortul pentru producerea si intretinerea lor sa fie minim. Trebuie insa stiut modul in care au fost implementate obiectele interfetei utilizator. In plus, importanta mai este si cunoasterea asocierii informatiilor cu obiectele si a anumitor rutine de biblioteci Windows cu controlul obiectelor.

Obiectele interfetei utilizator

Fereastra: este o parte a aplicatiei. Ea foloseste structurarea celorlalte obiecte si raspunde de schimbul de mesaje din sistem.
Icon: este un simbol, care caracterizeaza o parte a ferestrei de domeniu de acces asupra unei anumite functii. Astfel : meniul sistem, icon-ul de minimizare si de maximizare sunt domenii de pe ecran, pe care un clic de mouse provoaca o anumita reactie.
Meniuri: Windows ofera cinci tipuri de meniuri: de sistem de bare, tip Pulldown,imbricate si Tear-off. Ele contin comenzi si optiuni de program.
Cel mai simplu este meniul sistem,deoarece Windows se ingrijeste ca functionarea comenzilor sa fie unitara in intregul sistem.
Cursor: Cursorul este un bitmap si se deplaseaza pe ecran corespunzator cu deplasarea unui mouse sau a unei alte unitati de indicare pe ecran . Aspectul cursorului poate fi modificat(sageata ,stophand,clepsidra sau altele). Astfel cursorul poate fi adaptat cerintelor aplicatiei si usureaza perceperea optica adetaliilor unei aplicatii(de ex.:clepsidra la transferul datelor pe harddisk).
Caret: este denumirea cursorului tastaturii, deoarece prin cursor a fost deja numit aratatorul mouse-ului. Fereastra careia ii este arondata tastatura poate folosi un Caret pentru a arata ca sint posibile intrari de date prin intermediul tastaturii. Interfetele utilizator Windows nu permit decit folosirea unui singur caret. Inseamna ca atunci cind o fereastra primeste controlul tastaturii, ea trebuie sa produca un caret, iar atunci cind ea pierde controlul, va trebui sa-l distruga.
Scrollbar: Nu intotdeauna fereastra poate cuprinde intregul domeniu al obiectelor de date. Afisarea barelor de defilare exemplifica aceasta stare de fapt. Cu ajutorul scrollbar-elor utilizatorul poate modifica domeniul de afisare al obiectului de date.
Boxa de dialog: Aceste boxe reprezinta posibilitati de catre utilizator.
Ele sint necesare, de exemplu, atunci cind dupa lansarea unei comenzi mai sint necesare informatii suplimentare pentru executarea ei corecta. Acestea pot fi cerute si respectiv corectate prin intermediul unei boxe de dialog.

Aplicatiile Windows pun programatorilor urmatoarele probleme:

1.Aplicatiile trebuie sa fie comandate prin evenimente.
2.Windows cere ca toate iesirile spre periferice (ecran, imprimanta) sa fie de natura grafica.
3.Folosirea consecventa a obiectelor interfetei utilizator.

Interfatarea prin cozi de asteptare

Una din cele mai mari diferente intre programarea DOS si cea Windows este modul de tratare a evenimentelor din sistem. Daca un program DOS poate citi (prin intermediul intreruperilor) starea sau evenimentul de la periferic, in Windows lucrurile stau cu totul altfel. O descriere completa a unui eveniment din sistem se numeste mesaj. Mesajele sint unitatea de baza in interactiunea aplicatie-Windows.
Orice aplicatie Windows are cel putin doua functii:
-WinMain(functia principala-in C standard se numea "main")
-o functie care este atasata ferestrei aplicatiei.
Intre cele doua functii si nucleul sistemului are loc un permanent schinb de mesaje dupa modelul urmator: un eveniment exterior este interceptat de Windows, transformat in mesaj si depus intr-o coada de asteptare atasata aplicatiei
(coada aplicatiei). Functia WinMain parcurge o bucla continua (bucla de mesaje) in care interogheaza starea propriei cozi de asteptare. Daca exista mesaje, acestea sint dispecerizate cu ajutorul unor functii nucleu spre functia atasata ferestrei aplicatiei care, in concordanta cu mesajul, reactualizeaza, daca e cazul, fereastra de pe ecran. O exemplificare a acestui mecanism apare in fig.2.

Windows
ÚAAAAAAAAAAAAAAAAAA¿
Se apasa³ ÚAAAAAAAAAAAAAA¿ ³ tasta AAA>³ Coada sistem ³ ³ Aplicatia
³ AAAAAAAAAAAAAAAÙ ³ ÚAAAAAAAAAAAAAAAAAAAA¿
³ A ³ ³ ÚAAAAAAAAAAAAAAAA¿ ³
³ \|/ ³ ³ ³ Functia WinMain³ ³
³ ÚAAAAAAAAAAAAAA¿ ³ ³ AAAAAAAAAAA¿ ³ ³
³ ³ Coada ³<AAAAAAAAAA³ Bucla de ³ ³ ³
³ ³ aplicatiei ³AAAAAAAAAA>³ mesaje ³ ³ ³
³ AAAAAAAAAAAAAAAÙ ³ ³ AAAAAAAAAAAAAAAAAÙ ³
³ Windows primeste ³ ³ ³ ³
³ mesajul A din ³ ³ ³ ³
³ bucla de mesaje <AAAAA<AAAAAAAAAAÙ ³
³ a aplicatiei si ³ ³ ÚAAAAAAAAAAAAAAAA¿ ³
³ il directioneazaAAAA>AAAAA>³ Functia ³ ³
³ spre functia ³ ³ ³ ferestrei ³ ³
³ ferestrei ³ ³ AAAAAAAAAAAAAAAAAÙ ³
³ aplicatiei ³ AAAAAAAAAAAAAAAAAAAAAÙ
³ ³ ³
³ Prin functia data³ TextOut ³
³ aplicatia cere <AAAAAAAAAAAAAAAAAAÙ
³ Windows-ului sa ³ Fereastra aplicatiei
³ afiseze in ³ ÚAAAAAAAAAAAAAAAAAAAAAA¿
³ fereastra ei ³ ³A³ ³\/³/\³
³ sirul "A" ³ AAAAAAAAAAAAAAAAAAAAAAAa
³ ³ ³ ³ ³

³ AAAAAAAAAAAAAAAAAAAAAA>A ³
³ ³ ³ ³
AAAAAAAAAAAAAAAAAAAÙ AAAAAAAAAAAAAAAAAAAAAAAÙ fig 2 - Dispecerizarea mesajelor in Windows

Un caz particular il reprezinta evenimentul care cere terminarea aplicatiei. Figura 3 ilustreaza acest caz, in care succesiunea fazelor e inversata: nucleul distruge fereastra de pe ecran, apoi anunta functia atasata ferestrei de terminarea iminenta a aplicatiei. Aceasta elibereaza eventualele resurse alocate si depune in coada aplicatiei mesajul WM_QUIT. Acesta este preluat in bucla de mesaje a functiei WinMain, semnificand iesirea din bucla si cu aceasta incheierea aplicatiei.

Windows
ÚAAAAAAAAAAAAAAAAAA¿
Se alege³ Windows sterge de³ Fereastra aplicatiei
EXIT din³ pe ecran fereas-³ ÚAAAAAAAAAAAAAAAAAAAAAA¿ aplica- ³ tra aplicatiei ³ ³A³ ³\/³/\³ tie ³ si apoi ... ³ AAAAAAAAAAAAAAAAAAAAAAAa
³ ³ ³ ³ ³
³ AAAAAAAAAAAAAAAAAA>³ ³
³ ³ ³ ³
³ ³ AAAAAAAAAAAAAAAAAAAAAAAÙ
³ ³
³ ³
³ ³ ÚAAAAAAAAAAAAAAAAAAAA¿
³ Trimite mesajul WM_DESTROYÚAAAAAAAAAAAAAAAA¿ ³
³WM_DESTROY directAAAAAAAAAA>³ Functia ³ ³
³functiei ferestrei³ ³ ³ ferestrei ³ ³
³ ³ ³ ³Pune in coada ei³ ³
³ ³ ³ ³ de mesaje ³ ³
³ ³ ³ ³ WM_QUIT ... ³ ³
³ ³ ³ AAAAAAAAAAAAAAAAAÙ ³
³ ³ ³ ³ ³
³ WM_QUIT ³ ³ ³
³ ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ ³
³ ³ ³ ³ ÚAAAAAAAAAAAAAAAA¿ ³
³ \|/ ³ ³ ³ Functia WinMain³ ³
³ ÚAAAAAAAAAAAAAA¿ ³ ³ AAAAAAAAAAA¿ ³ ³
³ ³Coada mesajelor<AAAAAAAAAA³ Bucla de ³ ³ ³
³ ³ aplicatiei ³AAAAAAAAAA>³ mesaje ³ ³ ³
³ AAAAAAAAAAAAAAAÙ WM_QUIT ³ AAAAAAAAAAAAAAAAAÙ ³
AAAAAAAAAAAAAAAAAAAÙ AAAAAAAAAAAAAAAAAAAAAÙ
\|/
Bucla de mesaje se termina la primirea mesajului WM_QUIT si apoi functia WinMain, terminindu-se si aplicatia fig 3 - Procedura de terminare a unei aplicatii

Comportamentul nucleului Windows se datoreste multitasking-ului. Dar multitasking-ul este nepreemptiv, deoarece nu nucleul gestioneaza timpul in care aplicatia are acces la resurse, ci aceasta trebuie sa cedeze controlul cat mai repede nucleului.

O aplicatie Windows

ÚAA¿ ÚAA¿
Scrierea surselor ³.C³ ³.H³
AAAÙ AAAÙ Editoare resurse
³ ³ ÚAAAA¿ ÚAAAA¿ ÚAAAA¿ ÚAAAA¿ ÚAAAA¿
Scrierea (desenarea) ³ ³ ³.BMP³ ³.ICO³ ³.CUR³ ³.DLG³ ³.FNT³ resurselor ³ ³ AAAAAÙ AAAAAÙ AAAAAÙ AAAAAÙ AAAAAÙ
³ ³ \AAAAAAAAAAAAAAA\/AAAAAAAAAAAAAAA/
³ ³ ÚAAA¿
Crearea fisierului de ³ ³ ³.RC³ resurse ³ ³ AAAAÙ
³ ³ ³
ÚAAAA\/AAAAA\/AAA¿ ³
Compilarea surselor ³ Compilator C ³ ³
AAAAAAAAAAAAAAAAAÙ ³
³ ³
\³/ ³
ÚAAAA¿ ³
³.OBJ³ ³
AAAAAÙ ³
Crearea fisierului de ³ ÚAAAA¿ ³ definire modul ³ ³.DEF³ bibl. Windows ³
³ AAAAAÙ bibl. C ³
³ ³ ³ ³
Linkeditare impreuna cu ÚAA\/AAAAAA\/AAA\/AA¿ ³ bibliotecile C si Windows ³ Linkeditare ³ ³
AAAAAAAAAAAAAAAAAAAAÙ ³
³ ³
ÚA\/A¿ ÚAAAAAAAA\/AAAAAAAA¿
Compilarea resurselor ³.EXE³ ³Compilator resurse³
AAAAAÙ AAAAAAAAAAAAAAAAAAAÙ
³ ³
³ ÚA\/A¿
³ ³.RES³
³ AAAAAÙ
AAAAA¿ ÚAAAAAÙ
³ ³
ÚAAA\/AAAAAAAA\/AAAAA¿
Adaugarea resurselor la fisierul ³ Compilator resurse ³ executabil AAAAAAAAAAAAAAAAAAAAAÙ
³
ÚA\/A¿
Aplicatia Windows ³.EXE³
AAAAAÙ fig 4 - Succesiunea operatiilor pentru o aplicatie Windows

Nu toti pasii prezentati in figura 4 sunt obligatorii, exemplul care urmeaza bazindu-se doar pe sursa C si definirea modulului .DEF. Aceste doua componente compilate cu includerea bibliotecilor C si Windows duc la obtinerea unui executabil Windows.

Observatii :

-nu incercati sa preluati controlul total; CPU este o resursa partajabila.
-nu incercati sa accesati direct memoria si resursele hard (tastatura, ecran, mouse, timer, porturi,etc...). Nucleul Windows trebuie sa aiba un control total, pentru a asigura partajarea lor tuturor aplicatiilor.
-functiile pe care le apeleaza nucleul Windows (de exemplu functia atasata ferestrei aplicatiei) trebuie declarate cu cuvintele cheie FAR PASCAL pentru o buna transmitere a parametrilor.
-fiecare aplicatie trebuie sa aiba o functie WinMain. Aceasta este punctul de intrare al aplicatiei. Ea va crea fereastra aplicatiei si va initia bucla de mesaje. Functia va fi declarata PASCAL dar nu si FAR deoarece va fi apelata prin start-up atasat la link-editare.
-la folosirea functiilor Windows (peste 550 de functii oferite de biblioteca
Windows API-Application Program Interface) e bine sa fie interpretate valorile returnate.
-cand accesati resursele incercati sa folositi doar functiile Windows API in locul celor din biblioteca standard C.

Un prim exemplu de program

*Despre functii

In primul rind acest program, care in C-ul standard ar fi o banalitate, are doua functii in loc de un "main" clasic. Din cele expuse mai sus se observa ca aplicatia contine doua functii : una este obligatoriu WinMain si reprezinta punctul de intrare in program iar cea dea doua este functia ferestrei (sau procedura ferestrei, deoarece ea proceseaza mesajele catre fereastra). WinMain trece prin doua faze. Prima este asa numita initializare de program, cea de-a doua poarta numele de bucla de mesaj. Complexitatea lui WinMain consta in initializare, care consta la randui lui in executare a trei rutine de biblioteci
Windows si anume: "RegisterClass", "Create Window", "Show-Window".
Pe linga acestea mai exista 14 functii apelate in acest program. Aceste functii fac parte din API si sint declarate in windows.h-header-ul ce nu trebuie sa lipseasca din nici o sursa de program Windows.

Identificatori in majuscule

In acelasi header exista o multime de identificatori ce vor fi descrisis in continuare.

*Constante

Multe valori pentru parametrii de functii sau valori ale cimpurilor structurilor de date ale API sint predefinite in windows.h. Numele lor este format dintr-un prefix specific categoriilor carora li se atribuie si un nume cit mai sugestiv, de exemplu in linia :

wndClass.style = CS_HREDRAW |CS_VREDRAW;

CS_ provine de la >>class style<< categorie ce specifica stilul unei clase de ferestre, HREDRAW si VREDRAW insemnind redesenare la modificare pe orizontala sau verticala. Valorile numerice sint in general intregi pe 16 biti, de multe ori avind doar un bit pe 1 restul 0, ca flagurile.

*Tipuri de date si structuri de date

Tot in windows.h sint definite o suma de noi tipuri de date si sructuri, specifice API-ului de WINDOWS. Citeva dintre acestea sunt:

WORD -intreg de 16 biti fara semn
LONG -intreg de 32 biti cu semn
HANDLE -handle (vezi mai jos)
FARPROC -pointer de 32 de biti la o functie
LPSTR -pointer de 32 de biti la un sir de caractere structuri
MSG -structura de mesaj
WNDCLASS-structura pentru o clasa de ferestre
PAINTSTRUCT-structura pentru a putea picta in interiorul unei ferestre
RECT -structura de descriere a unui dreptunghi

*Notatia ungara - variabile

Observati ca sursa programului are citeva variabile cu un aspect deosebit. Exista o conventie respectata de majoritatea programatorilor Windows adoptata in cinstea legendarului programator de la Microsoft, Charles Simonyi. In baza ei numele incepe cu una sau mai multe litere mici specificind tipul de data, urmate de numele propriu-zis (daca sint mai multe cuvinte se scriu impreuna fiecare incepind cu majuscula). Iata citeva exemple

>>lp<< semnifica long pointer
>>sz<< semnifica string zero, deci un sir de caractere terminat cu un octet de zero.
>>IpszCmdLine<< pointer la un buffer ce contine linia de comanda la lansarea aplicatiei

Doua concepte majore exista in programarea Windows : ce este si cum se foloseste un handle precum si ce semnificatie are instanta unui program.

*Handle

Este utilizat la manipularea obiectelor. De fapt este un intreg fara semn folosit in mod unic de catre nucleul Windows pentru a identifica entitati.
Exista o larga varietate de handle-uri: pentru instanta unei aplicatii, identificarea unei ferestre, a unui creion sau pensule dintr-un dispozitiv grafic, a unui mediu sau control de pe ecran. Majoritatea handle-urilor reprezinta indecsi de acces la informatii memorate in tablouri. Daca se doreste un acces la date se furnizeaza nucleului Windows handle-ul si valoarea de modificat, acesta facind restul. Aceasta este o modalitate prin care Windows isi protejeaza datele din mediul sau multitasking.

*Instante

Se numesc asa prezentele simultane in memorie ale copiilor aceleiasi aplicatii.
Precum s-ar putea banui deci, nu numai ca pot fi lansate simultan mai multe aplicatii, dar chiar aceeasi aplicatie poate sa ruleze in mai multe copii.
Pentru a face deosebirea intre acestea, Windows aloca un numar unic pe care il comunica aplicatiei la intrarea in functia ei principala WinMain. Acest numar este handle-ul instantei respective. O caracteristica a multitasking-ului din
Windows este ca acesta foloseste acelasi cod pentru toate instantele unei aplicatii si date. Metoda insa conditioneaza functionarea aplicatiei in acelasi segment de cod precum si evitarea stocarii de date in acest segment(_CS nemodificat).
Pentru majoritatea aplicatiilor Windows prima instanta are un rol special. Multe din resursele utilizate de aplicatie, de exemplu clasa de ferestre, sint create o singura data si apoi folosite de fiecare instanta.

Privire detailata asupra aplicatiei

Datorita declaratiilor legate de API este firesc ca programul sa inceapa cu includerea fisierului header windows.h (110k). Urmeaza declaratia de prototip a functiei WndProcSalut cu cei patru parametri, deoarece numele este folosit inaintea definirii functiei. Urmeaza punctul de intrare al aplicatiei care trebuie sa fie functia WinMain. Aplicatia primeste ca parametri de intrare hInstance -handle-ul instantei acordate de nucleu aplicatiei, hPrevInstance -handle-ul instantei anterioare, (daca nu exista atunci este zero, deci e vorba de prima instantiere), apoi lpszCmdLine -pointer lung la sirul terminat cu zero al caracterelor ramase in linia de comanda si in sfirsit CmdShow - un intreg ce specifica modul in care va aparea fereastra pentru prima data pe ecran. Daca e vorba de prima instantiere a aplicatiei

if(!hPrevInstance)

atunci trebuie descrisa clasa ferestrei aplicatiei WNDCLASS wndClass.

*Inregistrarea clasei de ferestre

In primul rind structura wndCLASS trebuie incarcata in cele zece cimpuri ale sale.
-cimpul >>style<< specifica stilul ferestrelor pentru clasa respectiva. De exemplu
CS_HREDRAW | CS_WREDRAW semnifica ca o modificare (de catre utilizator) a dimensiunii pe orizontala sau pe verticala a ferestrei va provoca un mesaj de repictare a ei.
-cimpul >>lpfnWndProc<< in care se declara pointer-ul la functia ferestrei, in cazul nostru WndProcSalut.
-cimpul >>cbClsExtra<< este un contor de octeti (count of bytes-cb) pentru octetii pe care programatorul ar dori sa-i rezerve in plus fata de aceasta structura
-cimpul >>cbWndExtra<< are aceeasi semnificatie doar ca rezervarea se va face alaturi de structura ferestrei.
-cimpul >>hInstance<< specifica instanta in care se inregistreaza fereastra
Urmeaza patru cimpuri legate de caracteristici ale afisarii si functionarii ferestrei:
-cimpul >>hIcon<< precizeaza un icon ce va fi afisat cind fereastra este minimizata. Handle-ul pentru acest icon este obtinut de la functia LoadIcon care incarca din instanta dorita (in acest caz NULL, deci este vorba de nucleu) icon-ul dorit IDI_APPLICATION predefinit.
-cimpul >>hCursor<< determina incarcarea unui cursor care sa fie afisat cind indicatorul mouse-ului se gaseste in fereastra aplicatie. Si in acest caz handle-ul pentru cursor se obtine prin apelarea functiei LoadCursor din nucleu specificind cursorul predefinit sageata IDC_ARROW.
-ultimul cimp >>hbrBackground<< primeste un handle pentru o pensula cu care sa fie pictat fondul ferestrei. Deoarece pensula de culoare alba este predefinita s-a apelat la functia GetStockObject cu parametru WHITE_BRUSH.
Structura de descriere a clasei se inregistreaza prin functia RegisterClass

* Crearea ferestrei

Clasa de ferestre defineste caracteristicile generale ale unei ferestre. Pe baza ei se pot defini ferestre care sa aiba particularitatile dorite de programator.
Functia CreateWindow primeste ca parametri aceste specificatii si returneaza handle-ul pentru noua fereastra. Parametrii sunt explicitati prin comentariul in sursa programului. Citeva observatii sunt totusi necesare: tipul ferestrei a fost declarat WS_OVERLAPPEDWINDOW, descriind o fereasra care are bara de titlu, meniu sistem, buton de minimizare si de maximizare precum si un chenar gros ce da posibilitatea rescalarii ferestrei. S-a specificat pentru numele feresterei sirul vid (NULL) pentru a specifica apoi mesajul WM_CREATE pe care functia
CreateWindow il trimite procedurii de fereastra WndProcSalut. Parametri urmatori pentru pozitia ferestrei respectiv marimea ei sint lasati la latitudinea nucleului prin constanta CW_USERDEFAULT. Urmeaza specificarea handle-ului ferestrei parinte, daca acesta exista, apoi handle-ul meniului ferestrei, daca e cazul. Ultimii doi parametri specifica instanta curenta a aplicatiei prin handle-ul hInstance si un pointer la structura feresterei CREATESTRUCT, care va fi trimis ca parametru functiei WndProcSalut pentru mesajul WM_CREATE daca se doreste modificarea acestei structuri. Deocamdata acest parametru este NULL.

* Afisarea ferestrei

In sfirsit fereasta a fost creata intern Windows. Pentru ca ea sa apara pe ecran este nevoie de apelul a inca doua functii. ShowWindow are ca prim parametru handle-ul hWnd proaspat obtinut in urma creerii ferestrei iar al doilea este primit din lista parametrilor functiei WinMain specificand modul in care fereastra va fi pentru prima data afisata. In mod normal acesta are valoarea SW_SHOWNORMAL deci fereastra va fi afisata la dimensiunile specificate la creare in pozitia specificata si cu culoarea de fond pentru zona de lucru definita in structura clasei de care apartine. Urmeaza apelul functiei UpdateWindow care va cere procedurii ferestrei prin mesajul WM_PAINT sa actualizeze spatiul de lucru. Din acest moment aspectul ferestrei pe ecran este rezolvat in totalitate urmind preocuparea pentru tratarea evenimentelor legate de aceasta.

* Bucla de mesaje

Aceasta este un bloc de cod realizat pe baza insructiunii while, in care exista trei functii GetMessage, TranslateMessage si DispatchMessage. Mesajul este o structura de date definita in windows.h dupa cum urmeaza :

typedef struct tagMSG A
HWND HWND; //handle la fereastra careia ii este destinat mesajul
WORD message; //mesajul (un numar pe 16 biti)
WORD wParam; //parametri specifici mesajului
LONG lParam; //
DWORD time; //timpul atasat mesajului
POINT pt; //punctul pe ecran unde se gaseste cursorul
SMSG; unde POINT este o alta structura definita dupa cum urmeaza: typedef struct tagPOINTA int x; //coordonata x in pixeli int y; //coordonata y in pixeli
SPOINT;

Functia GetMessage aduce in structura msg rezervata prin program mesajul din coada de mesaje a aplicatiei. Ultimii trei parametrii sint NULL respectiv 0,0 insemnind ca se doreste captarea mesajelor adresate tuturor ferestrelor aplicatiei.
Daca mesajul este oricare altul decit WM_QUIT, GetMessage returneaza o valoare diferita de zero. In cazul WM_QUIT programul va iesi din bucla si astfel executia functiei WinMain se va termina returnind nucleul cimpului wParam din structura mesajului. Functia TranslateMessage face o prelucrare eventuala asupra mesajelor de la tastatura. Urmeaza apelul functiei DispatchMessage care transfera mesajul inapoi catre nucleu urmind ca acesta sa-l trimita procedurii de fereastra pentru procesare. Functia DispatchMessage realizeaza deci dispecerizarea mesajelor aplicatiei catre ferestrele acesteia prin intermediul nucleului Windows. Iata d deci procedura indirecta prin care se apeleaza o functie de fereastra - in cazul exemplului WndProcSalut.

* Functia ferestrei

Am ajuns la programul propriu-zis, pentru ca tot ce-a fost pina acum a insemnat doar pregatirea pentru tratarea actiunilor pe care trebuie sa le indeplineasca aplicatia. Functia ferestrei (in documentatie: >>Window Procedure<<) determina ce anume se afiseaza in zona de lucru a ferestrei si care sunt actiunile consecutive comenzilor utilizatorului. O functie de fereastra va fi definita intotdeauna: long FAR PASCAL NumeFunctie(HWND hWnd, WORD message,WORD wParam,

LONG lParam) unde cei patru parametrii sunt identici cu primele patru cimpuri ale structurii mesajului. Procesarea mesajelor se face cu instructiune switch-case pe baza valorii mesajului. In windows.h sint definite toate valorile posibile pentru mesajele vehiculate de nucleu (identificatori a caror nume incepe cu WM_) existind posibilitatea ca programatorul sa-si defineasca si mesajele proprii de la WM_USER in sus.Cind un mesaj este procesat complet de functia ferestrei, aceasta trebuie sa returneze zero. In cazul in care mesajul este lasat pentru procesarea functiei implicite
DefWindowsProc, valoarea returnata de aceasta trebuie sa fie returnata si de functia ferestrei. Sa parcurgem pe rind mesajele procesate in exemplul nostru.

-WM_CREATE s-a introdus procesarea acestui mesaj spre a exemplifica ca functia
CreateWindow din WinMain anunta functia ferestrei prin acest mesaj ca se va crea structura CREATESTRUCT atasata ferestrei si dupa dorinta acum este momentul sa mai facem unele modificari asupra ei. S-a specificat functiei CreateWindow ca titlul ferestrei pe care o creaza este NULL si aici vom modifica acest titlu cu functia SetWindowText ca el sa fie >>Primul program<<.
-WM_PAINT - acest mesaj este extrem de important in programarea Windows. De citeva ori zona de lucru (client area) trebuie reactualizata nucleul informeaza functia ferestrei prin acest mesaj. In cazul exemplului UpdateWindow a facut-o si daca vom modifica marimea ferestrei - deoarece clasa are atributele de stil pe care le-am discutat anterior - nucleul va emite din nou spre fereastra acest mesaj. O sesiune de pictare a ferestrei este incadrata de doua apeluri complementare de functii: BeginPaint si EndPaint care actualizeaza respectiv elibereaza o structura cu informatii utile in procesul de pictare. Aceasta structura
PAINTSTRUCT ps, contine intre altele informatii legate de contextul dispozitivului de afisare al carui handle este returnat de BeginPaint. Contextul dispozitivului
(device context) cuprinde informatii legate de capabilitatile fizice ale ecranului si alte obiecte necesare procesului de pictare. Majoritatea functiilor care deseneaza sau scriu in zona de lucru a ferestrei folosesc acest handle de tip
HDC. Cu functia GetClientRect obtinem in structura rect dimensiunea dreptunghiului ce margineste zona de lucru. Relativ la acest dreptunghi textul se va afisa cu functia DrawText. Se va afisa deci prin intermediul hDC sirul de caractere
"Salut Windows !" parametrul urmator (-1) semnificind afisarea tuturor caracterelor sirului. Afisarea se va face relativ la dreptunghiul rect, in formatul
DT_CENTER | DT_VCENTER | DT_SINGLELINE. Acest ultim parametru realizeaza afisarea centrata atit pe orizontala cit si pe verticala intr-o singura linie a textului. Sesiunea de pictare se incheie cu EndPaint care valideaza spatiul modificat si elibereaza contextul dispozitivului
-WM_DESTROY - acest mesaj, asa dupa cum s-a aratat provine de la nucleul Windows cind acesta a distrus fereastra aplicatiei. Functia WndProcSalut trebuie sa depuna acum in coada de mesaje a aplicatiei mesajul WM_QUIT folosind functia
PostQuitMessage. Parametrul functiei PostQuitMessage este un cod de iesire
(exit code) care va fi acel wParam al ultimului mesaj cu care se incheie
WinMain.

Toate celelalte mesaje pentru fereastra noastra sint procesate de functia
DefWindowProc intr-o modalitate prestabilita.

* Modulul de definitie

Acest mic modul specifica linkeditorului citeva informatii vitale pentru obtinerea executabilului Windows.
-NAME este declaratia de nume a modulului.
-DESCRIPTION permite inserarea unui comentariu (de exemplu drept de copyright) de descriere a aplicatiei.
-EXETYPE specifica ca executabilul va fi pentru Windows.
-STUB numeste un program care va fi adaugat la inceputul fisierului pentru a putea fi lansat din DOS. El este raspunzator de mesajul de avertizare pe care un executabil Windows il lanseaza cind nu este lansat din mediu Windows:
>>This program requires Microsoft Windows<<.
Urmeaza doua declaratii asupra modului in care nucleul va trata segmentele cod respectiv de date.
-PRELOAD indica incarcarea imediata a memoriei,
-MOVEABLE - segmentul respectiv poate fi mutat la o alta locatie (daca nucleul doreste sa-si reorganizeze spatiul de memorie disponibil),
-DISCARDABLE - segmentul de cod poate fi eliberat la un moment dat si apoi la nevoie reincarcat din executabil
-MULTIPLE indica nucleului sa aloce segmente de date separate pentru fiecare instanta noua a aplicatiei.
-HEAPSIZE descrie cantitatea de memorie necesara in zona de date
-STACKSIZE marimea zonei alocata pentru stiva. Valorile acestor doua zone sint recomandate ca minime pentru o aplicatie Windows.
-EXPORTS este o lista a functiilor de fereastra si a altora care trebuie sa fie acesibile din nucleu.

//....................................................
//
//program-Salut.c
//scop-Un prim exemplu de aplicatie sub Windows
//
//....................................................

#include<windows.h>

long FAR PASCAL WndProcSalut(HWND,WORD,WORD,LONG);

#pragma argsused int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine, int CmdShow)
A
HWND hWnd;
MSG msg;
WNDCLASS wndClass;

if(!hPrevInstance) A
wndClass.style =CS_HREDRAW | CS_VREDRAW;
wndClass.lpszClassName ="Salut";
wndClass.lpfnWndProc =(WNDPROC)WndProcSalut;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =0;
wndClass.hInstance =hInstance;
wndClass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndClass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndClass.lpszMenuName =NULL;
wndClass.hbrBackground =GetStockObject(WHITE_BRUSH);

RegisterClass(&wndClass);
S hWnd=CreateWindow("Salut", //numele clasei de ferestre
NULL, //titlul ferestrei
WS_OVERLAPPEDWINDOW, //tipul
CW_USEDEFAULT, //coordonata x(colt sus stinga)
CW_USEDEFAULT, //coordonata y(colt sus stinga)
CW_USEDEFAULT, //marimea pe orizontala.cx
CW_USEDEFAULT, //marimea pe verticala.cy
NULL, //handlerul ferestrei parinte
NULL, //handlerul meniului ferestrei hInstance, //handlerul instantei programului who created this window
NULL); //parametrii la creare

ShowWindow(hWnd,CmdShow);
UpdateWindow(hWnd);

while (GetMessage(&msg,NULL,0,0))A
TranslateMessage(&msg);
DispatchMessage(&msg);
S return(msg.wParam);
S

#pragma argsused long FAR PASCAL WndProcSalut(HWND hWnd,WORD message,
WORD wParam,LONG lParam)
A switch(message)A case WM_CREATE:
SetWindowText(hWnd,"Primul program"); break; case WM_PAINT:
A
HDC hDC;
RECT rect;
PAINTSTRUCT ps; hDC=BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&rect);
DrawText(hDC,"Salut Windows!",-1,&rect,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
EndPaint(hWnd,&ps); break;
S case WM_DESTROY:
PostQuitMessage(0); return 0;
S return(DefWindowProc(hWnd,message,wParam,lParam));
S

NAME Salut

DESCRIPTION "Primul meu program sub Windows"
EXETYPE WINDOWS
STUB 'WINSTUB.EXE'

CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 1024
STACKSIZE 8192

EXPORTS WndProcSalut

Exercitii :
-realizati scrierea textului in alte zone ale ferestrei
-afisati mai multe mesaje in aceeasi fereastra in zone diferite
-sa se realizeze dimensiune data a ferestrei


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta