Documente Academic
Documente Profesional
Documente Cultură
Consecvenţa
privind interfaţă cu utilizatorul. Avantajul oferit de multitasking. Gestionarea memoriei. Interfaţa grafică
independentă de dispozitiv
Windows este o interfaţă grafică cu utilizatorul (GUI - graphical user interface), numită uneori şi „interfaţă vizuală" sau
„mediu grafic cu ferestre"Toate tipurile de interfeţe grafice cu utilizatorul folosesc elemente grafice afişate într-o
imagine de tip bitmap. Elementele grafice asigură o utilizare mai eficientă a spaţiului de afişare, un mediu bogat din
punct de vedere vizual pentru transferul de informaţii şi posibilitatea de afişare a rezultatelor aşa cum vor arăta în
realitate pe hârtie
Avantajul multitaskingului ar fi ca el ne permite sa executam mai multe operatii de care avem nevoie in acelasi timp, de
aceea noi putem sa ne permitem comutarea rapida de la un context la altul .
Gestionarea memoriei
Gestiunea memoriei are rolul de a decide cum trebuie organizată informaţia pe cele două nivele şi cand trebuie
transferată informaţia între acestea; tehnicile de gestiune a lucrărilor (multiprogramare, multitasking, time-sharing,etc)
implică existenţa unor metode eficiente pentru gestiunea memoriei: tehnici de alocare dinamică şi memoria
virtuală.Gestionarea memoriei trebuie sã asigure urmãtoarele funcţii: -organizarea informaţiilor în memoria internã
(gestionarea informaţiilor);
-organizarea schimbului de informaţii între memoria internã şi memoria externã (gestionarea schimbului de informaţii);
asigurarea protecţiei informaţiilor memorate în memoria internã (protecţia memoriei).
Interfata utilizator grafica (Graphical User Interface - GUI) permite utilizatorului sa comunice cu aplicatia, folosind în
acest scop obiecte grafice de pe ecran: ferestre, butoane, casete de validare, meniuri etc. Actionarea asupra acestora se
face folosind tastatura sau dispozitive de intrare speciale, dintre care cel mai raspândit este mouse-ul.
Un program standard apelează nu mai puţin de 17 funcţii Windows. Aceste funcţii, împreună cu o scurtă descriere,
sunt prezentate în continuare, în ordinea apariţiei în program:
• LoadIcon - încarcă o pictogramă care urmează să fie folosită de un program.
• LoadCursor - încarcă un indicator pentru mouse, care urmează să fie folosit de un program.
• GetStockObject - obţine un obiect grafic (în acest caz o pensulă folosită pentru desenarea fondului ferestrei).
• RegisterClassEx - înregistrează o clasă de fereastră pentru fereastra programului.
• CreateWindow - creează o fereastră pe baza unei clase de fereastră.
• ShowWindow - afişează o fereastră pe ecran.
• UpdateWindow - cere unei ferestre să se redeseneze.
• GetMessage - preia un mesaj din coada de mesaje.
• TranslateMessage - converteşte unele dintre mesajele de la tastatură.
• DispatchMessage - trimite un mesaj către o procedură de fereastră.
• PlaySound - redă un fişier de sunet.
• BeginPaint - iniţiază o operaţie de desenare a ferestrei.
• GetClientRect - obţine dimensiunile zonei client a ferestrei.
• DrawText - afişează un text.
• EndPaint - încheie o operaţie de desenare.
• PostQuitMessage - inserează un mesaj de încheiere în coada de aşteptare.
• DefWindowProc - execută operaţiile prestabilite de prelucrare a mesajelor.
În Windows, atunci când utilizatorul redimensionează o fereastră, sistemul de operare trimite programului un mesaj
prin care îi comunică noile dimensiuni ale ferestrei. Programul poate apoi să modifice conţinutul ferestrei, astfel încât
acesta să se adapteze la noile dimensiuni.
„sistemul de operare trimite programului un mesaj" - adica Windows apelează o funcţie din program. Parametrii
acestei funcţii descriu mesajul respectiv. Această funcţie din programul Windows este cunoscută sub numele de
„procedură de fereastră" („window procedure").
Procedura de fereastră
Procedura de fereastră este e funcţie care se poate afla chiar în program sau într-o bibliotecă cu legături dinamice (DLL).
Windows trimite un mesaj către o fereastră prin apelarea procedurii de fereastră. Procedura de fereastră prelucrează
anumite informaţii pe baza mesajului primit, apoi returnează controlul sistemului de operare.
WinMain şi WndProc
WndProc - trateaza mesajele care vin de la sistemul de operare.Ea mai determina continutul care va fi afisat in zona
client al ferestrei si modul cum fereastra va raspunde la ceea ce va face utilizatorul.Deasemenea aceasta functie dupa ce
se apeleaza functia BeginPaint , invoca rutina GetClientRect.
WndProc- este o procedura de fereastra a ferestrei create de programul Hello.... iar o procedura de fereastra nu
reprezinta altceva decit un mod de incapsulare a codului care raspunde intrarilor si afiseaza elementele grafice pe ecran.
Funcţia WinMain reprezintă punctul de intrare în program. Aceasta este echivalentul funcţiei main din programele
scrise în limbajul C. Orice program pentru Windows trebuie să aibă o funcţie WinMain.
a) Contextul de dispozitiv (prescurtat DC - device context) - este o structură de date întreţinută intern de interfaţa GDI.
Fiecare context de dispozitiv este asociat unui anumit dispozitiv de afişare, cum ar fi imprimanta, plotterul sau monitorul
video.O parte dintre valorile din contextul de dispozitiv sunt atribute grafice. Aceste atribute definesc unele
particularităţi privind modul de lucru al unor funcţii de desenare din interfaţa GDI. Atributele contextului de dispozitiv
controlează caracteristicile textului afişat.
b)Salvarea contextului de dispozitiv - Variabila handle a contextului de dispozitiv este eliberata de functia BeginPaint.
In general aceasta este salvata intr-o variabila numita hdc. In procedura de fereastra se defineste aceasta variabila astfel
: HDC hdc;
Tipul de date HDC este definit ca un întreg fără semn, pe 32 de biţi. Apelul funcţiei EndPaint eliberează variabila handle a
contextului de dispozitiv.
c)Functiile :
şapte funcţii acceptate de Windows 95 pentru desenarea liniilor sunt LineTo (linii drepte), Polyline şi PolylineTo (o serie
de linii drepte conectate), PolyPolyline (mai multe linii poligonale), Arc (linii eliptice), PolyBezier şi PolyBezierTo
Functia Polyline – foloseste ca punct de plecare pozitia curenta, si stabileste ca pozitie curenta sfirsitul ultimei linii
desenate.
Funcţia LineTo desenează o linie de la „poziţia curentă" definită în contextul de dispozitiv pană la punctul specificat la
apelarea funcţiei (exclusiv acest punct). Poziţia curentă este folosită ca punct de plecare şi de alte funcţii GDI. Dacă
apelaţi funcţia LineTo fără să stabiliţi mai întâi poziţia curentă, funcţia desenează o linie pornind din colţul din stânga-sus
al zonei client.
Dacă doriţi să desenaţi o linie din punctul (xStart, yStart) pană în punctul (xEnd, yEnd) trebuie să apelaţi mai întâi funcţia
MoveToEx ca să stabiliţi ca poziţie curentă punctul (xStart, ySfart): (MoveToEx (hdc, xStart, yStart, &pt) ;)
Functiile PolyBezier si PoluBezierTo se folosesc pentru trasarea uneia sau a mai multor curbe Bezier conexe:
PolyBezier (hdc, pt, iCount) ; sau instrucţiunea:
Funcţia PolyBezierTo foloseşte poziţia curentă ca punct de început pentru prima curbă Bezier. Fiecare curbă desenată
are nevoie doar de trei puncte. La returnarea funcţiei, poziţia curentă este punctul final al ultimei curbe desenate.
funcţiile Rectangle, Ellipse, RoundRect, Chord şi Pie are culoarea albă, funcţiile aparţin unei alte secţiuni din capitolul de
faţă, „Desenarea suprafeţelor pline",
Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;
Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;
Pie (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;
În cazul funcţiei Chord, Windows uneşte capetele arcului, iar în cazul funcţiei Pie, uneşte capetele arcului cu centrul
elipsei
Sistemul de operare Windows oferă avantaje semnificative faţă de mediul MS-DOS, atât pentru utilizatori, cât şi pentru
programatori. Multe dintre aceste avantaje sunt comune pentru utilizatori şi pentru programatori, deoarece sarcina
dezvoltatorilor unui program este să ofere utilizatorilor lucruri de care aceştia au nevoie. Windows 95 face posibil acest
lucru.
notaţia ungară", Charles Simonyi,fiecare nume de variabilă începe cu una sau mai multe litere mici care specifică tipul de
date al variabilei. aceşti doi parametri se definesc folosind tipurile de date WPARAM şi LPARAM, am păstrat denumirile
originale.
Variabila handle – este de obicei un nr pe 32 biti, care face trimitere la un obiect. Valoarea reală a variabilei
handle nu este importantă pentru program, dar modulul Windows care o furnizează programului ştie cum să îl
manipuleze pentru trimiterea la obiect.
9 Ce este programare controlată de evenimente? Programele orientate eveniment sunt formate de obicei dintr-
un număr de programe mici numite handlere de eveniment, care sunt apelate ca răspuns la evenimente externe și
dintr-un coordonator (dispatcher), care apelează handlerele de evenimente, folosind de obicei o coadă a
evenimentelor, care să rețină evenimentele care nu au fost procesate.
Device Context – structura de date intretinuta intern de interfata GDI.O parte din valorile din DC sunt atributele grafice ,
ce definesc careva particularitati referitor la modul de lucru a unor functii de desenare din interfata GDI.
Prin multitasking noi putem intelege executarea simultana a mai multor taskuri.In versiunile anterioare ale Windowsului
era folosit multitaskingul necontrolat, ceea ce insemna ca nu se folosea ceasul sistemului ca sa se aloce timpi de
procesare a diferitor programe ce rulau in sistem. Multitaskingul controlat insa permite aceasta alocare a timpilor de
procesare , ceea ce inseamna ca programele cedeaza voluntar controlul , astfel incit alte programe sa isi poate si ele
continua executia.In Windows 95 multitaskingul este controlat si programele se pot imparti in mai multe fire de executie,
care par sa ruleze in acelasi timp.
Clasa butoanelor are o procedură de fereastră (aflată într-una dintre bibliotecile cu legături dinamice ale sistemului de
operare) care prelucrează mesajele trimise către ferestrele butoanelor, ceea ce determină ca toate butoanele să
reacţioneze într-un mod similar la anumite acţiuni ale utilizatorului(de ex: schimbarea culorii în cazul apasării).
Procedura ferestrei buton din Windows execută întreţinerea acestor butoane şi toate operaţiile de redesenare.
Sistemul de operare este responsabil de interpretarea click-urilor de mouse, redesenarea butonului sau de modul în
care butonul se mişcă atunci când este apăsat. Sarcina programatorului este să intercepteze mesajul WM_COMMAND -
acesta este modul în care butonul informează procedura ferestrei despre declanşarea unui eveniment.
15.Coduri virtuale de taste. Starea tastelor de modificare. Utilizarea mesajelor de acţionare a tastelor.
Fiecare tastă este identificată de un număr numit cod virtual. Acest cod virtual este conţinut în parametrul wParam
al mesajelor WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN. Cel mai des utiizate coduri virtuale sunt
definite în fişierele antet din windows, având un nume sepcific precedat de prefixul VK- virtual key. De exemplu:
VK_SHIFT, VK_CONTROL şi VK_RETURN sunt codurile virtuale corespunzătoare tastelor Shift, Ctrl şi Enter ale tastaturii.
Starea tastelor de modificare (Shift, Alt, Ctrl) poate fi obţinută cu ajutorul funcţiei GetKeyState. De exemplu:
GetKeyState (VK_SHIFT) returnează o valoare negativă (adică un număr în care primul bit are valoarea 1) dacă tasta Shift
este apăsată. Valoarea returnată de apelul: GetKeyState (VK_CAPITAL) are un 1 în bitul cel mai puţin semnificativ dacă
tasta Caps Lock este activă. Funcţia GetKeyState nu verifică starea tastaturii în timp real, ci starea tastaturii până în
momentul mesajului curent. Pentru a obţine starea curentă a unei taste, se foloseşte funcţia GetAsyncKeyState.
În principiu, este necesar ca în scrierea unui program windows să se ţină cont numai de mesajele WM_KEYDOWN şi
WM_KEYUP, întrucât mesajele WM_SYSKEYUP, WM_SYSKEYDOWN sunt folosite pentru funcţii de sistem (deci nu este
necesară interceptarea lor). Mai mult, dacă sunt prelucrate mesajele WM_KEYDOWN, pot fi ignorate mesajele
WM_KEYUP.
Programele pentru Windows folosesc mesajele WM_KEYDOWN pentru tastele care nu generează caractere.
Folosirea mesajelor pentru acţionări de taste în combinaţie cu informaţiile despre tastele de modificare (furnizate de
funcţia GetKeyState) cu scopul de a le transforma în mesaje pentru caractere, poate genera probleme din cauza
diferenţelor între tastaturile internaţionale.
Mesajele WM_KEYDOWN sunt utile pentru tastele de deplasare, tastele funcţionale şi tastele speciale, precum
Insert, Delete. Uneori tastele Insert, Delete si tastele funcţionale sunt folosite ca acceleratori pentru comenzi de meniu.
Deoarece Windows transformă acceleratorii în comenzi de meniu, nu este nevoie să prelucraţi în program mesajele
pentru acţionarea tastelor de accelerare. De cele mai multe, mesajele WM_KEYDOWN sunt prelucrate numai pentru
tastele de deplasare a cursorului. Unele funcţii Windows folosesc de multe ori tastele de deplasare în combinaţie cu
tasta Shift pentru extinderea unei selecţii - de exemplu într-un procesor de texte. Tasta Ctrl este folosită deseori pentru
a schimba semnificaţia unei taste de deplasare. De exemplu, tasta Ctrl în combinaţie cu săgeata spre dreapta mută
cursorul cu un cuvânt la dreapta.
0 ;
Aceste funcţii au nevoie de variabila handle a ferestrei (transmisă procedurii de fereastră ca parametru) şi de adresa
unei variabile de tipul PAINTSTRUCT. În timpul prelucrării mesajului WM_PAINT, procedura de fereastră apelează mai
întâi funcţia BeginPaint ca să completeze câmpurile structurii ps. Valoarea returnată de funcţia BeginPaint este variabila
handle a contextului de dispozitiv. În general, aceasta este salvată într-o variabilă numită hdc de tipul HDC. Tipul de date
HDC este definit ca un întreg fără semn, pe 32 de biţi. Apelul funcţiei EndPaint eliberează variabila handle a contextului
de dispozitiv.
O altă metodă de obţinere a variabilei handle a contextului de dispozitiv, utlizată in afara prelucrarii mesajelor
WM_PAINT este apelul la funcţia GetDC. Funcţia ReleaseDC eliberează variabila atunci când nu mai este necesară:
hdc = GetDC(hwnd) ;
ReleaseDC(hwnd, hdc) ;
La fel ca funcţiile BeginPaint şi EndPaint, şi funcţiile GetDC şi ReleaseDC ar trebui apelate în pereche, în timpul
prelucrării aceluiaşi mesaj. Diferenţa dintre cele două metode de obţinere a variabilei hdc este că variabila handle
returnată de funcţia GetDC se referă la un dreptunghi cu întreaga zonă client a ferestrei, şi nu doar la un dreptunghi
invalid. Spre deosebire de funcţia BeginPaint, GetDC nu validează nici o regiune invalidă.
Un program Windows poate să obţină şi o variabilă handle a unui context de dispozitiv care se aplică întregii ferestre,
nu numai zonei client a ferestrei:
Contextul de dispozitiv include, în afară de zona client, bara de titlu a ferestrei, barele de derulare şi chenarul
Funcţiile BeginPaint, GetDC şi GetWindowDC obţin variabila handle a contextului de dispozitiv asociat unei anumite
ferestre de pe ecran. O funcţie mai generală pentru obţinerea variabilei handle a unui context de dispozitiv este
CreateDC:
DeleteDC (hdc);
Pentru a obţine o variabila handle a contextului de dispozitiv pentru tot spaţiul de afişare, se utilizează următorul
apel:
rând, cu puţină practică, de obicei puteţi să manipulaţi curba până ajunge la o formă apropiată de cea dorită.
curbelor Bezier implică relaţiile dintre punctele finale şi punctele de control. Curba este întotdeauna tangentă la
linia trasată de la primul punct final la primul punct de control şi are întotdeauna aceeaşi direcţie cu această linie.
(Această caracteristică este ilustrată vizual de programul BEZIER.) De asemenea, curba este întotdeauna tangentă la linia
trasată de la al doilea punct final la al doilea punct de control şi are întotdeauna aceeaşi direcţie cu această linie.
(Acestea sunt alte două ipoteze de la care este derivată formula Bezier.)
Funcţia PolyBezierTo foloseşte poziţia curentă ca punct de început pentru prima curbă Bezier. Fiecare curbă
desenată are nevoie doar de trei puncte. La returnarea funcţiei, poziţia curentă este punctul final al ultimei
curbe desenate.
20. Desenarea suprafeţelor pline. Funcţia Polygon şi modul de umplere a poligoanelor. Funcţia
SetPolyFillMode. Umplerea suprafeţelor interioare.
Ellipse Elipsă
Windows desenează conturul figurilor folosind peniţa curentă selectată în contextul de dispozitiv şi umple interiorul
lor cu pensula curentă. În mod prestabilit, aceasta este pensula de stoc WHITE_BRUSH, ceea ce înseamnă că interiorul
figurilor va fi umplut cu alb. Windows defineşte şase pensule de stoc: WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH,
DKGRAY_BRUSH, BLACK_BRUSH şi NULL_BRUSH (sau HOLLOW_BRUSH).
Pentru a obţine variabila handle a unei pensulei de stoc se apelează funcţia GetStockObject:.
pensula respectivă va colora interiorul figurilor în gri. Pentru a desena o figură fără contur se utilizează peniţa NULL_PEN,
şi , în mod similar, pentru a desena o figură fără contur se utlizează pensula NULL_BRUSH.
Funcţia Polygon este utlizată pentru a desena diverse poligoane pe baza unui sistem de puncte. Ea are drept
parametric variabila handle a contextului de dispozitiv, un pointer la o matrice de structure POINT, şi numărul de puncte
din matrice: Polygon (hdc, pt, iCount) .
Suprafaţa închisă de poligon este colorată folosind pensula curentă în două moduri: ALTERNATE sau WINDING .
Modul prestabilit de umplere a poligoanelor este ALTERNATE, ceea ce înseamnă că Windows colorează numai
suprafeţele închise la care se poate ajunge din exteriorul poligonului prin traversarea unui număr impar de laturi (1, 3, 5
şi aşa mai departe). Celelalte suprafeţe interioare nu sunt umplute.
Modul WINDING de umplere, presupune colorarea tuturor suprafeţelor închise de polygon. Modul de umplere
poate fi setat cu ajutorul funcţiei SetPolyFillMode:
Interiorul figurilor Rectangle, RoundRect, Ellipse, Chord, Pie, Polygon şi PollyPolygon este umplut cu pensula - numită
uneori şi „model" („pattern") - selectată în contextul de dispozitiv. O pensulă este de fapt o imagine bitmap 8x8 repetată
pe verticală şi pe orizontală, pentru umplerea unei suprafeţe.
21. Dimensiunea unui caracter. Funcţia GetTextMetrics. Tipul TEXTMETRIC. Dimensiunile textului.
Dimensiunea unui caracter este necesară în cazul utilizării funcţiei TextOut pentru afişarea mai multor linii. Spaţiul
dintre liniile succesive de text poate fi stabilit pe baza înălţimii unui caracter iar spaţiul dintre coloane pe baza lăţimii
medii a caracterelor din font.
Dimensiunile caracterelor sunt obţinute prin apelarea funcţiei GetTextMetrics. Funcţia GetTextMetrics are ca
parametru o variabilă handle a contextului de dispozitiv, deoarece returnează informaţii despre fontul selectat în
contextul de dispozitiv. Windows copiază valorile referitoare la dimensiunile caracterelor într-o structură de tip
TEXTMETRIC. Valorile sunt exprimate în unităţi de măsură care depind de modul de mapare selectat în contextul de
dispozitiv. În contextul prestabilit de dispozitiv, modul de mapare este MM_TEXT, aşa că dimensiunile sunt date în pixeli.
Pentru folosirea funcţiei GetTextMetrics se defineşte mai întâi o variabilă de tipul TEXTMETRIC (numită, de obicei, tm):
TEXTMETRIC tm;
hdc = GetDC(hwnd);
hdc);
Astfel se obţine o structura cu infomţii despre dimensiunile textului, care pot fi salvate pentru utilizarea în viitor.
Dimensiunile textului:
tmInternalLeading - spaţiul păstrat deasupra unui caracter pentru semnele de accentuare. tmExternalLeading - spaţiul
recomandat pentru a fi lăsat între rândurile de text. tmAveCharWidth -lăţimea medie a literelor mici.
22. DIMENSIUNEA ZONEI CLIENT. Macroinstrucţiunile LOWORD şi HIWORD (LOWORD (lParam), HIWORD
(lParam)). Barele de derulare. Domeniul şi poziţia unei bare de derulare.
Dimensiunile totale ale ferestrei mărite pot fi obţinute prin apelarea funcţiei GetSystemMetrics cu parametrii
SM_CXFULLSCREEN şi SM_CYFULLSCREEN. Pentru un monitor VGA valorile returnate sunt 640 şi 461 de pixeli.
O metodă obişnuită de determinare a dimensiunilor zonei client a unei ferestre este prelucrarea mesajului WM_SIZE
în procedura de fereastră. Windows trimite un mesaj WM_SIZE către procedura de fereastră, de fiecare dată când se
modifică dimensiunile ferestrei. Parametrul lParam transmis procedurii de fereastră conţine lăţimea zonei client în
cuvântul mai puţin semnificativ (LOWORD) şi înălţimea zonei client în cuvântul mai semnificativ (HIWORD). Codul
pentru prelucrarea acestui mesaj arată astfel:
static int cxClient, cyClient ;
Ele sunt poziţionate vertical (pentru deplasări în sus şi în jos) sau orizontal (pentru deplasări la stânga şi la dreapta).
Bara de derulare este parcursă longitudinal de o „casetă de derulare" care indică poziţia aproximativă a părţii afişate pe
ecran faţă de întregul document.
Pentru a include în fereastra aplicaţiei o bară de derulare orizontală sau vertical este necesar de a include
identificatorul WS_VSCROLL (derulare verticală) şi/sau WS_HSCROLL (derulare orizontală) în stilul de fereastră din apelul
funcţiei CreateWindow.
Poziţia casetei de derulare este reprezentată întotdeauna printr-o valoare întreagă. De exemplu, o bară de derulare
cu domeniul cuprins între 0 şi 4 are cinci poziţii ale casetei de derulare.
Pentru a stabili o nouă poziţie a casetei de derulare pe bara de derulare se utilizează funcţia SetScrollPos :
Parametrul iPos reprezintă noua poziţie, care trebuie să fie cuprinsă în domeniul delimitat de iMin şi iMax. Windows
conţine funcţii asemănătoare (GetScrollRange şi GefScrollPos) pentru obţinerea domeniului şi a poziţiei unei bare de
derulare.
Iată o metodă pentru crearea, selectarea şi ştergerea peniţelor.Mai întâi definim variabilele pentru stocarea
variabilelor handle ale stilurilor:
static HPEN hPen;
În timpul prelucrării mesajului WM_PAINT (sau în orice alt moment în care avem o variabilă handle validă a
contextului de dispozitiv) putem să selectam oricare dintre peniţe în contextul de dispozitiv şi să desenam:
SelectObject (hdc, hPen) ;
Folosind funcţiile CreatePen sau CreatePenIndirect putem crea o „peniţă logică" (logical pen) care este doar o descriere a
unei peniţe.
Funcţiile CreatePen, CreatePenIndirect şi ExtCreatePen returnează o variabilă handle a peniţei logice create.
Parametrul iPenStyle precizează dacă se desenează o linie continuă, o linie punctată sau una întreruptă.
Pentru stilurile PS_SOLID, PS_NULL şi PS_INSIDEFRAME, parametrul iWidth reprezintă grosimea liniei. Dacă iWidth are
valoarea 0, liniile desenate de Windows vor avea grosimea de un pixel. Dacă parametrul iWidth are o valoare mai
mare de 1, Windows va desena o linie continuă.
Parametrul rgbColor din funcţia CreatePen este un număr întreg fără semn reprezentând culoarea peniţei.
Pentru a afisa mai multe linii de text avem nevoie să obţinem valorile pentru înălţimea şi lăţimea caracterelor. Acest
lucru se poate realiza prin definirea a două variabile în care să salvam lăţimea medie (cxChar) şi înălţimea totală a
caracterelor (cyChar):
Aceste variabile sunt declarate ca statice deoarece trebuie să fie valide atunci când procedura de fereastră
prelucrează alte mesaje (cum ar fi WM_PAINT). Dacă variabilele sunt declarate ca globale în alte funcţii nu mai este
necesar să fie declarate statice.
case WH_CREATE:
tm.tmHeight + tm.tmExternalLeading;
return 0;
Funcţia GetSystemMetrics returnează informaţii despre dimensiunea unor elemente grafice din Windows, cum ar fi
pictograme, cursoare, bare de titlu şi bare de derulare. Aceste dimensiuni depind de placa video şi de driverul de afişare.
Funcţia GetSystemMetrics acceptă un singur parametru, numit „index". Indexul este unul dintre cei 73 de identificatori
de tip întreg definiţi în fişierele antet din Windows. GetSystemMetrics returnează o valoare întreagă care reprezintă, de
obicei, dimensiunea elementului transmis ca parametru.
Functiile wsprintf si sprintf permit afisarea numerelor formatate, cat si siruri simple de caractere. Dacă nu trebuie să
afişam numere în virgulă mobilă, putem folosi funcţia wsprintf în locul funcţiei sprintf. Funcţia wsprintf are aceeaşi
sintaxă ca şi funcţia sprintf, dar este inclusă în Windows, aşa că nu va mări dimensiunea fişierului executabil. Diferenta
dintre printf si wsprintf este ca şirul de caractere formatat este stocat într-o matrice de caractere, si returnează lungimea
şirului de caractere.
47. Funcţia TextOut. Contextul de dispozitiv. Obţinerea unei variabile handle a contextului de dispozitiv:
Contextul de dispozitiv (prescurtat DC - device context) este o structură de date întreţinută intern de interfaţa GDI.
Fiecare context de dispozitiv este asociat unui anumit dispozitiv de afişare, cum ar fi imprimanta, plotterul sau monitorul
video. În cazul monitoarelor video, un context de dispozitiv este de obicei asociat unei anumite ferestre de pe ecran.
Prima metoda de a obtine variabila handle este in timpul prelucrarii mesajelor WM_PAINT.
Sunt implicate două funcţii: BeginPaint şi EndPaint. Aceste funcţii au nevoie de variabila handle a ferestrei (transmisă
procedurii de fereastră ca parametru) şi de adresa unei variabile de tipul PAINTSTRUCT. De obicei, programatorii
Windows numesc această variabilă ps şi o definesc în procedura de fereastră astfel:
PAINTSTRUCT ps;
În timpul prelucrării mesajului WM_PAINT, procedura de fereastră apelează mai întâi funcţia BeginPaint ca să
completeze câmpurile structurii ps. Valoarea returnată de funcţia BeginPaint este variabila handle a contextului de
dispozitiv. În general, aceasta este salvată într-o variabilă numită hdc. În prcedura de fereastră definiţi această variabilă
astfel:
HDC hdc;
Tipul de date HDC este definit ca un întreg fără semn, pe 32 de biţi. Programul poate apoi să folosească funcţii GDI,
cum ar fi TextOut. Apelul funcţiei EndPaint eliberează variabila handle a contextului de dispozitiv.
WM_PAINT :
return 0 ;
Ignorarea tastaturii
Tastatura trebuie să fie partajată de toate aplicaţiile rulate simultan sub Windows. Unele aplicaţii pot avea mai
multe ferestre, iar tastatura trebuie să fie partajată de toate ferestrele din cadrul aceleiaşi aplicaţii. Atunci când este
apăsată o tastă, o singură fereastră trebuie să primească mesajul privind apăsarea tastei respective. Fereastra care
primeşte acest mesaj este fereastra care deţine „cursorul de intrare" („input focus").
Conceptul cursorului de intrare este strâns legat de conceptul de „fereastră activă". Fereastra care deţine cursorul
de intrare este fie fereastra activă, fie o fereastră descendent a ferestrei active. De obicei, fereastra activă este uşor de
identificat. Dacă fereastra activă are o bară de titlu, Windows evidenţiază bara de titlu a acesteia. Dacă fereastra activă
are un cadru de dialog (o formă des întâlnită în casetele de dialog) în locul unei bare de titlu, Windows evidenţiază acest
cadru. Dacă fereastra activă a fost redusă la o pictogramă (minimizată), Windows evidenţiază textul afişat sub
pictogramă.
O procedură de fereastră poate să afle când are cursorul de intrare prin interceptarea mesajelor WM_SETFOCUS şi
WM_KILLFOCUS. Mesajul WM_SETFOCUS indică faptul că fereastra primeşte cursorul de intrare (input focus), iar
mesajul WM_KILLFOCUS indică faptul că fereastra pierde cursorul de intrare.
Orice fereastră creată de un program are asociată o procedură de fereastră. Procedura de fereastră este e funcţie
care se poate afla chiar în program sau într-o bibliotecă cu legături dinamice (DLL). Windows trimite un mesaj către o
fereastră prin apelarea procedurii de fereastră. Procedura de fereastră prelucrează anumite informaţii pe baza mesajului
primit, apoi returnează controlul sistemului de operare.
O procedură de fereastră prelucrează mesajele trimise ferestrei respective. Deseori, aceste mesaje informează
fereastra cu privire la acţiunile executate de utilizator cu ajutorul mouse-ului sau al tastaturii. Aceasta este calea prin
care o fereastră „află", de exemplu, că un buton a fost apăsat. Alte mesaje comunică ferestrei că a fost redimensionată
sau că trebuie să fie refăcută.
Atunci când un program este lansat în execuţie, Windows creează o „coadă de mesaje" („message queue") pentru
programul respectiv, în această coadă de mesaje sunt păstrate mesajele trimise către toate ferestrele pe care le creează
programul. Programul conţine o mică secvenţă de cod numită „ciclu de mesaje" („message loop") care preia mesajele
din coada de aşteptare şi le distribuie procedurilor de fereastră corespunzătoare. Alte mesaje sunt trimise direct
procedurii de fereastră, fără să mai fie plasate în coada de mesaje.
Windows este o interfaţă grafică cu utilizatorul (GUI - graphical user interface), numită uneori şi „interfaţă vizuală"
sau „mediu grafic cu ferestre" („graphical windowing environment"). La început, ecranul era folosit numai pentru
afişarea informaţiilor pe care utilizatorul le introducea de la tastatură. Într-o interfaţă grafică, ecranul devine chiar o
sursă pentru celelalte intrări ale utilizatorului. Pe ecran sunt afişate diferite obiecte grafice sub forma pictogramelor şi a
unor dispozitive de intrare, precum butoanele şi barele de derulare. Folosind tastatura (sau, mai direct, un dispozitiv de
indicare precum mouse-ul) utilizatorul poate să manipuleze direct aceste obiecte de pe ecran. Obiectele grafice pot fi
deplasate, butoanele pot fi apăsate şi barele de derulare pot fi derulate.
Interacţiunea dintre program şi utilizator devine mult mai directă. În locul unui ciclu unidirectional al informaţiilor de
la tastatură la program şi de la program la ecran, utilizatorul interacţionează direct cu obiectele de pe ecran.
Utilizatorii nu mai sunt dispuşi să piardă prea mult timp pentru a învăţa cum se foloseşte calculatorul sau cum să
stăpânească un anumit program. Windows îi ajută în acest sens, deoarece toate programele pentru Windows au un
aspect asemănător şi se comportă fundamental la fel. Programele ocupă o fereastră - o suprafaţă dreptunghiulară de pe
ecran. Fereastra poate fi identificată datorită unei bare de titlu. Majoritatea funcţiilor oferite de program sunt apelate cu
ajutorul unui meniu. Informaţiile afişate care nu încap pe un singur ecran pot fi vizualizate cu ajutorul barelor de
derulare. Unele articole de meniu apelează casete de dialog în care utilizatorul introduce informaţii suplimentare. În
majoritatea programelor mai mari pentru Windows există o casetă de dialog care deschide un fişier. Această casetă de
dialog arată la fel (sau foarte asemănător) în mai multe programe Windows şi este apelată aproape întotdeauna cu
aceeaşi opţiune de meniu.
Din punctul de vedere al programatorului, consecvenţa în realizarea interfeţei cu utilizatorul este rezultatul folosirii
procedurilor integrate în Windows pentru construirea meniurilor şi a casetelor de dialog. Toate meniurile au aceeaşi
interfaţă cu tastatura şi cu mouse-ul deoarece aceste operaţii sunt manipulate mai degrabă de Windows, decât de
programul respectiv.
Programele scrise pentru Windows nu au acces direct la componentele hardware ale dispozitivelor de afişare, cum ar fi
ecranul sau imprimanta. În schimb, Windows foloseşte un limbaj de programare pentru grafică (numit GDI - Graphics
Device Interface) care simplifică afişarea textului formatat şi a elementelor grafice. Windows transformă componentele
hardware de afişare în dispozitive virtuale. Un program scris pentru Windows va rula cu orice placă video şi cu orice
imprimanta pentru care Windows are un driver de dispozitiv. Programul nu trebuie să determine ce tip de dispozitiv fizic
este ataşat la calculator.
Crearea unei interfeţe grafice independente de dispozitiv pentru calculatoarele IBM PC nu a fost o sarcină uşoară pentru
dezvoltatorii sistemului de operare Windows. Proiectarea calculatoarelor personale s-a făcut pe baza principiului
arhitecturilor deschise. Producătorii terţi de componente hardware au fost încurajaţi să dezvolte dispozitive periferice, şi
datorită acestui fapt au apărut o mulţime de astfel de dispozitive. Deşi au fost create anumite standarde, programele
convenţionale pentru MS-DOS trebuie să asigure suportul individual pentru diferite configuraţii standard. De exemplu,
este un lucru destul de obişnuit ca un program de procesare de texte pentru MS-DOS să fie livrat împreună cu câteva
dischete care conţin mai multe fişiere mici, pentru adaptarea la diferite tipuri de imprimante. Programele Windows 95
nu au nevoie de drivere proprii, deoarece acestea sunt asigurate chiar de sistemul de operare.
53. Interfaţa pentru dispozitive grafice. Filozofia GDI. Structura interfeţei GDI. Tipuri de apeluri de funcţii.
Primitive GDI.
Interfaţa pentru dispozitive grafice (GDI - Graphics Device Interface) este o componentă a sistemului de operare
Windows 95 şi are ca sarcină afişarea elementelor grafice (inclusiv a textului) pe ecran şi la imprimantă. GDI este, în
general, un sistem de afişare static, ce permite numai animaţii limitate. Aşa cum este implementată în Windows 95,
interfaţă GDI nu asigură un suport direct pentru afişarea tridimensională sau pentru rotirea obiectelor.
Din punctul de vedere al programatorului, interfaţa GDI este formată din câteva sute de apeluri de funcţii şi unele tipuri
de date, macroinstrucţiuni şi structuri asociate acestor funcţii
Elementele grafice pe care le afişaţi pe ecran sau le tipăriţi la imprimantă pot fi împărţite în mai multe categorii, numite
„primitive". Iată care sunt aceste categorii:
- Linii şi curbe. Liniile reprezintă baza oricărui sistem de desenare vectorial. GDI permite folosirea
liniilor drepte, a dreptunghiurilor, a elipselor (inclusiv subsetul de elipse cunoscute sub numele de
cercuri), a arcelor - care sunt curbe reprezentând porţiuni din circumferinţa unei elipse sau a curbelor
Bezier
- Suprafeţe pline. Dacă o serie de linii sau de curbe închid o suprafaţă, aceasta poate fi „umplută" folosind
pensula GDI curentă. Această pensulă poate fi o culoare compactă, un model (haşuri orizontale,
verticale sau pe diagonală) sau o imagine bitmap repetată pe verticală sau pe orizontală.
- Imagini bitmap. Imaginile bitmap sunt matrice dreptunghiulare de biţi, care corespund pixelilor unui
dispozitiv de afişare. Imaginile bitmap sunt instrumente de bază pentru sistemele grafice de tip rastru. În
general, acestea sunt folosite pentru afişarea imaginilor complexe (deseori preluate din lumea reală) pe
ecran sau pentru tipărirea acestora la imprimantă. De asemenea, imaginile bitmap sunt folosite pentru
afişarea unor mici imagini (cum ar fi pictograme, indicatoare de mouse şi butoane de pe barele cu
instrumente de lucru ale aplicaţiilor) care trebuie afişate foarte rapid.
- Text. Textul este mai puţin „matematic" decât alte aspecte ale graficii pe calculator. Textul, aşa cum îl
ştim, este legat de sute de ani de tipografia tradiţională, apreciată adesea ca adevărată artă. Din acest
motiv, textul este de multe ori nu doar cea mai complexă parte a sistemului grafic, ci şi cea mai
importantă. Structurile create pentru definirea fonturilor şi pentru obţinerea informaţiilor despre fonturi
sunt printre cele mai mari din Windows. Începând cu versiunea Windows 3.1, interfaţa GDI acceptă
fonturile TrueType, bazate pe contururi umplute, care pot fi manipulate de alte funcţii GDI.
Mesajul WM_CHAR
Atunci când trebuie să prelucreze caracterele introduse de la tastatură (de exemplu, într-un procesor de texte sau întrun
program de comunicaţii) programul prelucrează mesajele WM_CHAR.
.Dacă utilizatorul apasă o literă (de exemplu, tasta A), procedura de fereastră primeşte un mesaj WM_CHAR pentru care
parametrul wParam conţine codul ASCII al literei „a" cu semnul diacritic respectiv.
Barele de derulare se numără printre cele mai reuşite componente ale unei interfeţe grafice pentru mouse; sunt
uşor de folosit şi determină o reacţie vizuală foarte rapidă. Barele de derulare sunt poziţionate vertical (pentru deplasări
în sus şi în jos) sau orizontal (pentru deplasări la stânga şi la dreapta).
Windows trimite procedurii de fereastră mesajul WM_VSCROLL sau mesajul WM_HSCROLL atunci când utilizatorul
execută clic pe bara de derulare sau trage caseta de derulare cu ajutorul mouse-ului. Fiecare acţiune cu mouse-ul asupra
barei de derulare generează cel puţin două mesaje - unul la apăsarea butonului şi al doilea la eliberarea acestuia.
Procedura de fereastră poate să primească mai multe mesaje SB_LINEUP, SB_PAGEUP, SB_PAGEDOWN,
SB_LINEDOWN dacă butonul mouse-ului este ţinut apăsat în timp ce indicatorul lui este poziţionat pe bara de derulare.
Mesajul SB_ENDSCROLL semnalează eliberarea butonului mouse-ului. În general puteţi ignora mesajele SB_ENDSCROLL.
Atunci când cuvântul mai puţin semnificativ al parametrului wParam are una dintre valorile SB_THUMBTRACK sau
SB_THUMBPOSITION, cuvântul mai semnificativ al parametrului wParam conţine poziţia curentă pe bara de derulare.
Această poziţie se încadrează în domeniul barei de derulare.
Cel mai bine este să structuraţi programul astfel încât toate operaţiile de desenare în zona client să se facă în timpul
prelucrării mesajelor WM_PAINT. Deoarece programul trebuie să aibă posibilitatea de redesenare a întregii zone client
în momentul primirii unui mesaj WM_PAINT, probabil veţi duplica unele secvenţe de cod dacă veţi face tipărirea şi în
alte puncte din program.
În unele aplicaţii s-ar putea să nu fie suficientă simpla transmitere a unor mesaje WM_PAINT prin marcarea unor
porţiuni din fereastră ca invalide. După ce apelaţi funcţia InvalidateRect, Windows plasează în coada de aşteptare un
mesaj WM_PAINT, iar procedura de fereastră va prelucra la un moment dat acest mesaj. Totuşi, Windows tratează
mesajele WM_PAINT ca mesaje de prioritate scăzută şi, dacă în sistem activitatea este intensă, poate să treacă un timp
destul de lung pană la prelucrarea acestora. Toată lumea a văzut „găuri" albe în ferestre după închiderea unor casete de
dialog.
Dacă doriţi ca actualizarea porţiunii invalide să se facă imediat, după funcţia InvalidateRect apelaţi imediat funcţia
UpdateWindow:
UpdateWindow (hwnd) ;
Funcţia UpdateWindow determină sistemul de operare să apeleze procedura de fereastră cu un mesaj WM_PAINT dacă vreo
porţiune a zonei client este invalidă. (Dacă întreaga zonă client este validă, procedura de fereastră nu mai este apelată.) Acest mesaj
WM_PAINT sare peste coada de aşteptare, procedura de fereastră fiind apelată direct de Windows. După ce procedura de fereastră
încheie operaţia de redesenare, sistemul de operare cedează din nou controlul programului şi execuţia continuă de la instrucţiunea de
după apelul funcţiei UpdateWindow.
ScrollWindow
Funcţia Windows ScrollWindow este folosită pentru derularea conţinutului ferestrei. Această funcţie are următorul
format:
ScrollWindow (hwnd, xInc, yInc, pRect, pClipRect) ;
Valorile xlnc şi ylnc specifică numărul de pixeli cu care se face derularea. Daca parametrii pRect şi pClipRect au
valoarea NULL, atunci se specifica faptul că trebuie derulată întreaga zonă client. Windows invalidează dreptunghiul
din zona client „descoperit" de operaţia de derulare. Aceasta generează un mesaj WM_PAINT. Nu este necesară
apelarea funcţiei InvalidateRect. (Reţineţi că funcţia ScrollWindow nu este o procedură GDI, deoarece nu are nevoie
de o variabilă handle. ScrollWindow este una dintre puţinele funcţii non-GDI din Windows care modifică aspectul
zonei client a ferestrei.)
56. Mesaje generate de mouse în afara zonei client. Mesajul de testare a poziţiei. Mesajele generează
mesaje.
Mesajele generate de mouse în afara zonei client corespund mesajelor din zona client, dar includ caracterele „NC"
(de la „non-client"). Dacă mouse-ul este deplasat în afara zonei client a unei ferestre, procedura de fereastră primeşte
următoarele mesaje:
Buton Eliberat Apăsat (al doilea clic)
Apăsat
Totuşi, parametrii wParam şi lParam pentru mesajele generate de mouse din afara zonei client sunt diferite de cele
generate din zona client. Parametrul wParam indică zona non-client din care a fost generat mesajul. Parametrul wParam
poate conţine unul dintre identificatorii cu prefixul HT („hit test") definiţi în fişierele antet din Windows.
Variabila lParam conţine coordonata pe axa x în cuvântul mai puţin semnificativ şi coordonata pe axa y în cuvântul
mai semnificativ. Totuşi, aceste coordonate sunt relative la ecran, nu la zona client. Pentru coordonatele de ecran,
punctul de origine (0,0) este colţul din stânga-sus al zonei de afişare a ecranului. Valorile coordonatei x cresc către
dreapta, iar valorile coordonatei y cresc în jos
Mesajul WM_NCHITTEST („non client hit test") este folosit pentru verificarea poziţiei din care a fost generat mesajul.
Acest mesaj precede toate celelalte mesaje generate de mouse, din zona client sau din afara acesteia. Parametrul
IParam al mesajului conţine coordonatele x şi y ale indicatorului de mouse. Parametrul wParam nu este folosit.
De obicei, aplicaţiile Windows transmit acest mesaj funcţiei DefWindowProc. Windows foloseşte mesajul
WM_NCHITTEST ca să genereze celelalte mesaje, în funcţie de poziţia mouse-ului. Pentru mesajele din afara zonei client,
valoarea returnată de funcţia DefWindowProc în urma prelucrării mesajului WM_NCHITTEST devine parametrul wParam
al mesajului generat. Această valoare poate fi oricare dintre valorile wParam care însoţesc mesajele generate de mouse
din afara zonei client, plus următoarele:
HTCLIENT Zona client
HTNOWHERE Nici o fereastră
Windows foloseşte mesajul WM_NCHITTEST ca să genereze alte mesaje de mouse. Ideea mesajelor care generează
alte mesaje este des întâlnită în Windows. După cum ştiţi, dacă executaţi dublu clic pe pictograma meniului sistem a
unui program Windows, execuţia acestuia se încheie. Executarea unui dublu clic generează o serie de mesaje
WM_NCHITTEST. Deoarece indicatorul mouse-ului se află deasupra pictogramei meniului sistem, funcţia
DefWindowProc returnează valoarea HTSYSMENU şi Windows inserează în coada de aşteptare a programului un mesaj
WM_NCLBUTTONDBLCLK care conţine în parametrul wParam valoarea HTSYSMENU.
De obicei, procedura de fereastră retransmite acest mesaj funcţiei DefWindowProc. Atunci când recepţionează
mesajul cu parametrul wParam egal cu HTSYSMENU, funcţia DefWindowProc inserează în coada de aşteptare un mesaj
WM_SYSCOMMAND cu parametrul wParam egal cu SC_CLOSE. (Acest mesaj WM_SYSCOMMAND este generat şi atunci
când utilizatorul selectează opţiunea Close din meniul sistem.) Din nou, procedura de fereastră transmite acest mesaj
funcţiei DefWmdowProc. Funcţia DefWindowProc îl prelucrează trimiţând procedurii de fereastră mesajul WM_CLOSE.
Dacă doriţi ca programul să ceară confirmarea utilizatorului înainte de terminare, procedura de fereastră trebuie
sunt intercepteze mesajul WM_CLOSE. În caz contrar, funcţia DefWmdowProc prelucrează mesajul WM_CLOSE apelând
funcţia DestroyWindow. Printre alte acţiuni, funcţia DestroyWindow trimite procedurii de fereastră un mesaj
WM_DESTROY. În mod normal, procedura de fereastră prelucrează mesajul WM.DESTROY astfel:
case WM_DESTROY :
0;
Funcţia PostQuitMessage determină sistemul de operare să insereze în coada de mesaje un mesaj WM_QUIT. Acest
mesaj nu ajunge niciodată la procedura de fereastră, deoarece determină funcţia GetMessage să returneze valoarea 0,
care încheie ciclul de tratare a mesajelor.
57. MESAJE GENERATE DE MOUSE ÎN ZONA CLIENT Mesaje non-client. Măştile MK_LBUTTON,
MK_MBUTTON, MK_RBUTTON, MK_SHIFT, MK_CONTROL.
Mesaje zona-client> Atunci când mouse-ul este deplasat peste zona client a unei ferestre, procedura de fereastră
primeşte mesajul WM_MOUSEMOVE. Dacă un buton al mouse-ului este apăsat sau eliberat în zona client a unei ferestre,
procedura de fereastră primeşte un sir de mesaje ca: WM_LBUTTONDOWN WM_LBUTTONUP
WM_LBUTTONDBLCLK de si de asemenea un sir de mesaje pentru celelate butoane ale soricelului(pentru butonul
din mijloc si cel din dreapta-depinde de tipul mouse’ului(cu unul doua sau trei butoane, cit si de specificatiile ferestre ce
poate sau nu sa primeasca dublu clik)). , parametrul lParam conţine poziţia mouse-ului.
Mesaje NC> Dacă mouse-ul se află în afara zonei client, dar se află încă în fereastră, Windows trimite procedurii de
fereastră un mesaj „non-client". Zona „non-client" include bara de titlu, meniul şi barele de derulare ale ferestrei. În
general nu este nevoie să prelucraţi mesajele generate în afara zonei client(DefWindowProc()).Mesajele generate de
mouse în afara zonei client corespund mesajelor din zona client, dar includ caracterele
„NC"(WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,WM_NCLBUTTONDBLCLK). Parametrul wParam indică zona
nonclient din care a fost generat mesajul. Parametrul wParam poate conţine unul dintre identificatorii cu prefixul HT.
Variabila lParam conţine coordonata pe axa x în cuvântul mai puţin semnificativ şi coordonata pe axa y în cuvântul
mai semnificativ(raportate la zona ecran).
Mastiel> Valoarea parametrului wParam indică starea buloanelor mouse-ului şi starea tastelor Shift şi Ctrl. Puteţi să
testaţi parametrul wParam folosind o serie de măşti definite în fişierele antet din Windows.
MK_LBUTTON Butonul din stânga al mouse-ului este apăsat
MK_MBUTTON Butonul din mijloc al mouse-ului este apăsat
MK_RBUTTON Butonul din dreapta al mouse-ului este apăsat
60. Mesajele privind tastatura: acţionări de taste şi „caractere". Taste obişnuite şi taste de sistem.
WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP. Variabila lParam.
Actionari de taste si caractere> Mesajele privind tastatura pe care un program le recepţionează de la sistemul de
operare fac diferenţa între „acţionările de taste" („keystrokes") şi „caractere". Aceste noţiuni sunt legate de cele două
moduri în care puteţi să priviţi tastatura. În primul rând, tastatura este o colecţie de taste. Tastatura are o singură tastă
A; apăsarea tastei A este o acţionare de tastă, iar eliberarea tastei A este tot o acţionare de tastă. Tastatura este, însă, în
acelaşi timp, şi un dispozitiv de intrare care generează caractere afişabile. Tasta A poate să genereze mai multe
caractere, în funcţie de starea tastelor Ctrl, Shift şi Caps Lock. În mod normal, caracterul generat este a. Dacă tasta Shift
este apăsată, sau tasta Caps Lock este activă, caracterul generat este A. Dacă tasta Ctrl este apăsată, caracterul generat
este Ctrl+A. Dacă se foloseşte un driver de tastatură pentru o limbă străină, apăsarea tastei A poate să fie precedată de
un „caracter mort" („dead-character key") sau de tastele Shift, Ctrl sau Alt în diferite combinaţii. Combinaţiile pot să
genereze un caracter a sau A cu un accent.
Taste obisnuite si taste de sistem> Mesajele WM_SYSKEYDOWN şi WM_SYSKEYUP sunt generate, de obicei, pentru
taste apăsate în combinaţie cu tasta Alt. Aceste acţionari de taste apelează opţiuni din meniul programului ori din
meniul sistem, sunt folosite pentru funcţii ale sistemului, cum ar fi comutarea ferestrei active (Alt+Tab sau Alt+Esc) sau
sunt folosite pentru acceleratori de meniu (Alt în combinaţie cu o tastă funcţională). De obicei, programul ignoră
mesajele WM_SYSKEYDOWN şi WM_SYSKEYUP şi le retransmite funcţiei DefWindowProc. Deoarece Windows
manipulează combinaţiile Alt+tastă, nu este nevoie să interceptaţi aceste mesaje. WM_KEYDOWN şi WM_KEYUP sunt
caracteristice deja pentru tastele obisnuite.
Variabila lParam> Pentru toate mesajele legate de acţionările de taste variabila lParam (pe 32 de biţi) transmisă
procedurii de fereastră este împărţită în şase câmpuri: contorul de repetare(specifică numărul de acţionari de taste
reprezentat de un mesaj.
65. Modurile de mapare „metrice". Moduri de mapare proprii. Modul de mapare MM_ISOTROPIC.
Modul de mapare MM_ANISOTROPIC sau ajustarea imaginii.
Moduri de mapare metrice> Windows include două moduri de mapare în care coordonatele logice sunt exprimate în
unităţi fizice. Deoarece coordonatele logice pe axele x şi y sunt mapate la unităţi fizice identice, aceste moduri de
mapare vă ajută să desenaţi cercuri „mai rotunde" şi pătrate „mai pătrate".
Moduri de mapare proprii> Acestea sunt singurele moduri de mapare care vă permit să modificaţi extensiile ferestrei şi
ale vizorului, ceea ce înseamnă că vă permit să modificaţi factorul de scalare pe care Windows îl foloseşte pentru
convertirea coordonatelor logice şi a coordonatelor de dispozitiv.
MM_ISOTROPIC> Modul de mapare MM_ISOTROPIC este ideal pentru folosirea unor axe arbitrare, cu unităţi logice
egale pe cele două axe. Dreptunghiurile cu lăţimi şi înălţimi logice egale sunt afişate ca pătrate. Elipsele cu lăţimi şi
înălţimi logice egale sunt afişate ca cercuri.Puteţi să folosiţi un sistem de coordonate cartezian cu patru cadrane având
axe arbitrar scalate în cele patru direcţii şi cu punctul de coordonate (0, 0) în centrul zonei client. Dacă, de exemplu, vreţi
ca fiecare axă să ia valori de la 0 la 1000, folosiţi codul următor:
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL);
SetViewportExtEx (hdc, cxClient/2, -cyClient/2, NULL) ;
SetViewportOrgEx (hdc, cxClient/2, cyCllent/2, NULL) ;
Important este faptul ca imaginea va ramine neschimbata chiar daca fereastra e mai mult lata decit inaltasi invers.
MM_ANISOTROPIC> Atunci când stabiliţi extensiile ferestrei şi pe ale vizorului în modul de mapare MM_ISOTROPIC,
Windows ajustează valorile astfel încât unităţile logice de pe cele două axe să aibă aceleaşi dimensiuni. În modul de
mapare MM_ANISOTROPIC, Windows nu face nici o ajustare a valorilor pe care le stabiliţi. Aceasta înseamnă că în modul
de mapare MM_ANISOTROPIC nu este obligatorie păstrarea raportului corect de afişare.
Pentru a folosi modul de mapare MM_ANISOTROPIC, stabiliţi un sistem arbitrar de coordonate pentru zona client, ca şi
pentru modul de mapare MM_ISOTROPIC. Codul de mai jos stabileşte punctul de coordonate (0, 0) în colţul din
stângajos al zonei client, iar axele de coordonate x şi y pot lua valori de la 0 la 32.767:
SetMapMode (hdc, MM_ANISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
66. Modurile de mapare. Coordonate de dispozitiv şi coordonate logice. Sistemele de coordonate ale
dispozitivului. Vizorul şi fereastra. Folosirea modului de mapare MM_TEXT.
Modul de mapare> este un atribut al contextului de dispozitiv ce afecteaza aproape orice operatie de desnenare.De
exemplu in funcţia TextOut şi, de fapt, în toate funcţiile GDI, coordonatele sunt furnizate în „unităţi logice
Coordonatele de dispozitiv si cele logice> sunt un element important ce trebuie inteles.Cele fizice sunt coordonatele
dipozitivului fizic(adica pixelii) pe cind cele logice sunt dependete de modul de mapare.Insa cind se folosesc fiecare tip
de coordonate. Windows va folosi în continuare coordonatele de dispozitiv pentru toate mesajele (cum ar fi WM_SIZE,
WM_MOVE şi WM_MOUSEMOVE), pentru toate funcţiile care nu fac parte din interfaţa GDI şi chiar pentru unele funcţii
GDI. GetSystemMetrics nu este o funcţie GDI, aşa că va returna în continuare dimensiunile în unităţi de dispozitiv, adică
în pixeli. . Dacă modul de mapare este MM_LOENGLISH în momentul apelării funcţiei, GetTextMetrics returnează
lăţimea şi înălţimea caracterelor, în sutimi de inci.
67. Obţinerea informaţiilor despre culori. PLANES, BITSPIXEL, NUMCOLORS: Tipul COLORREF.
Funcţia GetDeviceCaps vă permite să determinaţi modul de organizare a memoriei în adaptoarele video şi numărul de
culori care pot fi reprezentate. Apelul de mai jos returnează numărul de planuri de culoare:
iPlanes = GetDeviceCaps (hdc, PLANES);
Apelul următor returnează numărul de biţi de culoare folosiţi pentru fiecare pixel:
iBitsPixel = GetDeviceCaps (hdc, BITSPIXEL)
Majoritatea adaptoarelor video care pot afişa culori folosesc fie mai multe planuri de culoare, fie mai mulţi biţi de
culoare pentru fiecare pixel, dar nu pe amândouă; cu alte cuvinte, unul dintre cele două apeluri de mai sus va returna
valoarea 1. Numărul de culori care pot fi redate de o placă video se poate calcula cu formula următoare:
iColors = 1<<(iPlanes * iBitsPixel);
Această valoare poate să nu fie identică cu numărul de culori obţinut prin apelarea funcţiei GetDeviceCaps cu
parametrul
NUMCOLORS:
iColors = GetDeviceCaps (hdc, NUMCOLORS);
Windows foloseşte pentru reprezentarea culorilor o valoare întreagă fără semn, pe 32 de biţi. Tipul de date folosit
pentru culori se numeşte COLORREF. Ultimii trei octeţi ai numărului (cei mai puţin semnificativi) specifică valorile pentru
culorile roşu, verde şi albastru, de la O la 255. Rezultă o paletă potenţială de 224 culori (aproximativ 16 milioane de
culori).
68. Obţinerea variabilei handle a contextului de dispozitiv. Obţinerea informaţiilor despre contextul de
dispozitiv.
Obtinerea variablilei Handle a CD>
hdc - BeginPaint (hwnd, &ps);
[alte Unii de program] EndPaint (hwnd, &ps);//Permite desenarea doar in zona invalida si validarea acesteia
hdc = GetDC (hwnd);
(alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga zona client
hdc = GetWindowDC (hwnd);
[alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga fereastra … ce poate creaa efecte
nedorite
Funcţiile BeginPaint, GetDC şi GetWindowDC obţin variabila handle a contextului de dispozitiv asociat unei anumite
ferestre de pe ecran. O funcţie mai generală pentru obţinerea variabilei handle a unui context de dispozitiv este
CreateDC: hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);
[alte linii de program] DeleteDC (hdc);
De exemplu, puteţi să obţineţi variabila handle a contextului de dispozitiv pentru tot spaţiul de afişare, cu următorul
apel:
hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
Uneori aveţi nevoie de unele informaţii despre un context de dispozitiv fără să desenaţi nimic. În această situaţie puteţi
să obţineţi o variabila handle a contextului de informaţii („information context") folosind funcţia CreateIC. Parametrii
sunt aceiaşi ca şi pentru funcţia CreateDC: hdclnfo = CreatelC ("DISPLAY", NULL, NULL, NULL); [alte linii de program]
DeleteDC (hdclnfo);
Atunci când lucraţi cu imagini bitmap, poate fi uneori utilă obţinerea unui „context de dispozitiv în memorie":
hdcMem = CreateCompatibleDC (hdc);
[alte linii de program] DeleteDC (hdcHem)
Puteţi să creaţi un metafişier prin obţinerea unui context de dispozitiv pentru metafişiere: hdcMeta
= CreateMetaFile (pszFilename);
[alte linii de program] hmf = CloseMetaFile (hdcMeta);
Dacă aveţi nevoie de anumite informaţii despre acest dispozitiv>, cum ar fi dimensiunile ecranului (dimensiunile în
pixeli şi cele fizice) sau posibilităţile de folosire a culorilor, puteţi să le obţineţi prin apelarea funcţiei GetDeviceCaps („get
device capabilities"):
iValue = GetDeviceCaps (hdc, iIndex) ;
Parametrul iIndex este unul dintre cei 28 de identificatori definiţi în fişierele antet din Windows. De exemplu, dacă iIndex
are valoarea HORZRES funcţia GetDeviceCaps returnează lăţimea dispozitivului în pixeli; VERTRES returnează înălţimea
dispozitivului în pixeli.
Pentru fonturile cu dimensiune fixă, cxCaps este egală cu cxChar. Pentru fonturile cu dimensiune variabilă, cxCaps este
150% din cxChar. Bitul cel mai puţin semnificativ al câmpului tmPitchAndFamily din structura TEXTMETRIC are valoarea 1
pentru fonturile cu dimensiune variabilă şi valoarea 0 pentru fonturile cu dimensiune fixă. Programul SYSMETS1 foloseşte
acest bit ca să calculeze valoarea cxCaps din cxChar:
Nu ar fi mai simplu dacă am putea să afişăm o coloană de numere aliniate la dreapta prin specificarea poziţiei în care se
termină numerele, în locul poziţiei la care încep acestea? După ce programul SYSMETS apelează funcţia:
coordonatele transmise funcţiilor TextOut care urmează specifică localizarea colţului din dreapta-sus al şirului de caractere, în
locul colţului din stânga-sus.
Funcţia TextOut care afişează coloana de numere are ca al doilea parametru următoarea expresie:
Parametrul iHatchStyle precizează aspectul haşurii şi poate avea una dintre următoarele valori: HS_HORIZONTAL,
HS_VERTICAL, HS_FDIAGONAL, HS_BDIAGONAL, HS_CROSS şi HS_DIAGCROSS. Parametrul rgbColor din funcţia
CreateHatchBrush reprezintă culoarea liniilor cu care se face haşurarea. Atunci când selectaţi pensula în contextul de dispozitiv,
Windows converteşte această culoare în cea mai apropiată culoare pură. Spaţiul dintre liniile de haşură sunt colorate în funcţie
de modul de desenare a fondului şi de culoarea fondului, definite în contextul de dispozitiv. Dacă modul de desenare a fondului
este OPAQUE, culoarea fondului este folosită pentru umplerea spaţiilor dintre linii, în acest caz, nici liniile de haşură, nici
culoarea de umplere nu pot fi culori amestecate. Dacă modul de desenare a fondului este TRANSPARENT, Windows desenează
liniile de haşura fără să umple spaţiile dintre acestea.
Deoarece pensulele sunt întotdeauna imagini bitmap 8x8, aspectul pensulelor haşurate va depinde de rezoluţia dispozitivului
pe care se face afişarea.
Cu ajutorul funcţiei CreatePatternBrush puteţi să creaţi pensule proprii, bazate pe o imagine bitmap:
80. Variabilele handle. Notaţia ungară. Punctul de intrare în program. Înregistrarea clasei de fereastră.
Crearea ferestrei. Afişarea ferestrei.
Mulţi programatori Windows folosesc „notaţia ungară", o convenţie de denumire a variabilelor. Convenţia este foarte
simplă - fiecare nume de variabilă începe cu una sau mai multe litere mici care specifică tipul de date al variabilei. De exemplu,
prefixul sz al variabilei szCmdLine semnifică „şir de caractere terminat cu zero". Prefixul h al variabilelor hInstance şi
hPrevInstance înseamnă „variabilă handle"; prefixul i al variabilei iCmdShow înseamnă „întreg". De exemplu, în funcţia
WinMain din programul HELLOWIN.C, variabila msg este o structură de tip MSG iar wndclass este o variabilă de tip
WNDCLASSEX. În funcţia WndProc, ps este o structură de tip PAINTSTRUCT iar rect este o structură de tip RECT.
Prefix Tip de
date c char
i int
(indicator)
w WORD (unsigned short) l
p pointer
În sfârşit, în program sunt folosiţi trei identificatori cu majuscule pentru diferite tipuri de variabile handle:
Identificator Semnificaţie
HINSTANCE Variabilă handle a unei „instanţe" - programul însuşi
O variabilă handle este pur şi simplu un număr (de obicei pe 32 de biţi) care face trimitere la un obiect. Un program obţine
aproape întotdeauna o variabilă apelând o funcţie Windows. Programul foloseşte apoi variabila handle obţinută pentru
trimiterea la obiect în alte funcţii. Valoarea reală a variabilei handle nu este importantă pentru program, dar modulul Windows
care o furnizează programului ştie cum să îl manipuleze pentru trimiterea la obiect.
Punctul de intrare într-un program Windows este o funcţie numită WinMain. Funcţia WinMain este întotdeauna definită
astfel:
int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
Această funcţie foloseşte secvenţa de apelare WINAPI şi la terminare returnează sistemului de operare o valoare întreagă.
Numele funcţiei trebuie să fie WinMain. Această funcţie are patru parametri:
Parametrul hlnstance este numit „variabilă handle a instanţei" („instance handle"). Acesta este un număr care identifică în
mod unic toate programele rulate în Windows. Utilizatorul poate rula simultan mai multe copii ale aceluiaşi program. Aceste
copii se numesc „instanţe" şi fiecare are o valoare diferită pentru parametrul hlnstance.
hPrevInstance („previous instance" - instanţa anterioară) este un parametru învechit. În versiunile Windows anterioare
acest parametru conţinea variabila handle a celei mai recente instanţe încă activă a aceluiaşi program. Dacă nu erau încărcate
alte instanţe ale programului, hPrevInstance avea valoarea 0 sau NULL.
Parametrul szCmdLine este un pointer la un şir de caractere terminat cu zero care conţine eventualii parametri transmişi
programului în linia de comandă.
Parametrul iCmdShow este un număr care indică modul iniţial de afişare a ferestrei în Windows. În majoritatea cazurilor,
iCmdShow are valoarea 1 sau 7. Mai sugestivi sunt identificatorii SW_SHOWNORMAL (definit în Windows ca 1) şi
SW_SHOWMINNOACTIVE (definit cu valoarea 7). Prefixul SW vine de la „show window" (afişare fereastră). Acest parametru
specifică dacă fereastra programului este afişată normal sau dacă este afişată iniţial doar ca o pictogramă.
O fereastră este întotdeauna creată pe baza unei clase de fereastră. Aceasta identifică procedura de fereastră care
prelucrează toate mesajele trimise către fereastră.
Pe baza aceleiaşi clase pot fi create mai multe ferestre. De exemplu, toate butoanele din Windows sunt create pe baza unei
singure clase de fereastră. Aceasta defineşte procedura de fereastră şi alte caracteristici ale ferestrei create pe baza clasei
respective. Atunci când creaţi o fereastră, definiţi şi atributele suplimentare ale acesteia, care sunt unice pentru fereastra
respectivă.
Înainte de a crea fereastra programului trebuie să înregistraţi o clasă de fereastră, apelând funcţia RegisterClassEx.
Funcţia RegisterClassEx acceptă un singur parametru: un pointer la o structură de tipul WNDCLASSEX. Structura
WNDCLASSEX este definită în fişierele antet din Windows astfel:
{
UINT cbSize ;
UINT style ;
WNDPROC lpfnWndProc ;
int cbClsExtra ;
int cbWnExtra ;
HINSTANCE hinstance ;
HICON hicon ;
HCURSOR hCursor ;
HBRUSH hbrBackground ;
LPCSTR lpszMenuName ;
LPCSTR lpszClassName ;
HICON hIconSm ;
}
WNDCLASSEX ;
În funcţia WinMain trebuie să definiţi o structură de tipul WNDCLASSEX, cum ar fi: WNDCLASSEX
wndclass ;
RegisterClassEx (&wndclass) ;
Cele mai importante câmpuri ale structurii sunt al treilea şi penultimul. Penultimul câmp conţine numele clasei de
fereastră. Al treilea câmp (lpfnWndProc) este adresa procedurii de fereastră folosită pentru toate ferestrele create pe baza
acestei clase. Celelalte câmpuri descriu caracteristicile tuturor ferestrelor create pe baza acestei clase.
wndclass.style = CS_HREDRAW | CS_VREDRAW ; combină doi identificatori pentru „stilul de clasă". Acestea sunt constante
pe 32 de biţi în care un singur bit are valoarea 1. Cei doi identificatori pentru stilul clasei indică faptul că
toate ferestrele create pe baza acestei clase sunt redesenate complet, ori de câte ori se modifică
dimensiunea pe orizontală (CS_HREDRAW) sau cea pe verticală (CS_VREDRAW) a ferestrei
wndclass.lpfnWndProc = WndProc ; Această instrucţiune stabileşte ca procedură de fereastră funcţia WndProc. Această
procedură va prelucra toate mesajele trimise către toate ferestrele create pe baza acestei clase de
fereastră. Aşa cum am arătat mai sus, prefixul lpfn înseamnă, în notaţia ungară, „pointer de tip long
la o funcţie".
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ; rezervă un spaţiu suplimentar în structura clasei şi în structura ferestrei, păstrată în interiorul
sistemului de Windows. Un program poate să utilizeze spaţiul suplimentar în scopuri proprii.
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; definesc o pictogramă pentru ferestrele create pe baza acestei
clase. Pictograma este o mică imagine de tip bitmap care apare în bara de taskuri a sistemului de operare şi în bara de titlu a
ferestrei. Pentru obţinerea unei variabile handle a unei pictograme predefinite apelaţi funcţia LoadIcon cu primul parametru
având valoarea NULL. Nu ne interesează valoarea reală a acestei variabile, ci doar o stocăm în câmpurile hIcon şi hIconSm.
wndclass.hCursor = LoadCursor (NULL, IDC_ ARROW) ; Funcţia LoadCursor încarcă un cursor predefinit pentru mouse,
numit IDC_ARROW, şi returnează o variabilă handle a acestui cursor. Atunci când este deplasat deasupra zonei client a
ferestrei create pe baza acestei clase, indicatorul mouse-ului este afişat sub forma unei săgeţi.
Se înregistrează clasa de ferestre prin apelarea funcţiei RegisterClassEx. Singurul parametru al funcţiei este un pointer
către structura WNDCLASSEX:
RegisterClassEx (&wndclass) ;
Crearea ferestrei
Clasa de fereastră defineşte caracteristicile generale ale unei ferestre, permiţând astfel folosirea aceleiaşi clase pentru
crearea mai multor ferestre.
hwnd =CreateWindow (szAppName, // numele clasei de fereastra
Parametrul indicat ca „variabilă handle a ferestrei părinte" are valoarea NULL, deoarece această fereastră nu are nici o
fereastră părinte. Atunci când între două ferestre există o relaţie părinte-descendent, fereastra descendent este afişată
întotdeauna pe suprafaţa ferestrei părinte. Parametrul indicat ca „variabilă handle a meniului" are tot valoarea NULL, deoarece
fereastra nu are meniu. Parametrul indicat ca „variabilă handle a instanţei programului" are ca valoare variabila handle
transmisă programului ca parametru la apelarea funcţiei WinMain. În sfârşit, „parametrul de creare" are valoarea NULL.
Funcţia Create Window returnează o variabilă handle a ferestrei create. Aceasta este salvată în variabila hwnd, definită ca
fiind de tipul HWND (variabilă handle a unei ferestre). Orice fereastră din Windows are o variabilă handle. Programul foloseşte
variabila handle pentru indicarea ferestrei. Dacă un program creează mai multe ferestre, fiecare are o variabilă handle diferită.
AFIŞAREA FERESTREI
După executarea funcţiei CreateWindow, fereastra a fost creată de Windows, dar încă nu este afişată pe ecran. Pentru
aceasta mai sunt necesare încă două apeluri de funcţii. Primul este:
Primul parametru este o variabilă handle a ferestrei create de funcţia CreateWindow. Al doilea parametru este variabila
iCmdShow, transmisă funcţiei WinMain. Dacă iCmdShow este SW_SHOWNORMAL (egal cu 1), fereastra este afişată normal. Dacă
iCmdShow este SW_SHOWMINNOACTIVE (egal cu 7), atunci fereastra nu este afişată, dar numele şi pictograma acesteia apar pe
bara de taskuri.
Apelul:
UpdateWindow (hwnd) ;
determină redesenarea zonei client. Acest lucru se face prin trimiterea către procedura de fereastră a unui mesaj
WM_PAINT.