Sunteți pe pagina 1din 29

1. ISTORIA WINDOWS. CE ADUCE NOU WINDOWS. Conceptele şi fundamentele GUI.

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

Windows reprezintă un SO complet , integrat pe 32 biţi şi care se distinge prin:

• facilităţi de conectare în reţea , protected-mode; de multitasking şi multithreading;

AVANTAJUL OFERIT DE MULTITASKING

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

-evidenţa ocupãrii memoriei interne;

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

Interfaţa grafică independentă de dispozitiv

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.

2 Apelurile de funcţii. Arhitectura bazată pe mesaje. Procedura de fereastră. WinMain şi WndProc.


Apelurile de funcţii Windows

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.

Arhitectura bazată pe mesaje

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

3. Atributele contextului de dispozitiv. Salvarea contextului de dispozitiv. Funcţiile LineTo, Polyline şi


PolylineTo, PolyPolyline, Arc, PolyBezier şi PolyBezierTo, Rectangle, Ellipse, RoundRect, Chord şi Pie.

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

LineTo (hdc, cxClient, cyClient) ;

Rectangle(hdc,xLeft,yTop,xRight,yBottom)(desenarea unui dreptunghi)

Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;( ne permite desenarea elipsei)

RoundRect (hdc, xLeft, yTop, xRight, yBottom, xCornerEllipse, yCornerEllipse) ;


(Funcţia pentru desenarea unui dreptunghi cu colţurile rotunjite )

Functiile PolyBezier si PoluBezierTo se folosesc pentru trasarea uneia sau a mai multor curbe Bezier conexe:
PolyBezier (hdc, pt, iCount) ; sau instrucţiunea:

PolyBezierTo (hide, pt, iCount) ;

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

Funcţiile Arc, Chord şi Pie primesc aceiaşi parametri:

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

PolyPolyline (mai multe linii poligonale),


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

6 CE ADUCE NOU SISTEMUL DE OPERARE WINDOWS

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.

7.Ce este notatia ungara ?

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.

8 Ce este o variabilă handle şi care este destinaţia ei?

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.

10. Ce este un device context

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.

11 Ce este multitaskingul controlat?

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.

13 Ce prezintă procedura unei ferestre?


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. Procedura de fereastra-
mai este si un mod de incapsulare a codului care raspunde intrarilor(de la tastatura/mouse) si afiseaza elementele
grafice pe ecran,facind acest lucru prin prelucrarea mesajelor trimise catre fereastra.

14. Clasa butoanelor


Clasa butoanelor este o clasă predefinită ce permite crearea controalelor de tip ferestre descendent sub formă de
butoane. Existenţa clasei într-unul dintre fişierele Windows permite crearea butoanelor direct prin apelarea
funcţiei CreateWindow, nefiind necesară inregistrarea clasei de fereastră.

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.

Utilizarea mesajelor de acţionare a tastelor:

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

17. Cum poate fi obţinută variabila handle a unui device context?


Există mai multe metode de obţinere a variabilei handle de dispozitiv. Prima metodă este legată de tratarea
mesajelor WM_PAINT, şi anume, prin apelul funcţiilor BeginPaint şi EndPaint:
case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

[apelarea unor funcţii GDI]

EndPaint (hwnd, &ps) ; return

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

[apelarea unor funcţii GDI]

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:

hdc = GetWindowDC (hwnd);

[alte linii de program]

ReleaseDC (hwnd, hdc);

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:

hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);


[alte linii de program]

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:

hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);

18. Curbe Bezier. Funcţia PolyBezierTo.


O curbă Bezier este definită prin patru puncte - două capete şi două puncte de control. Capetele curbei sunt ancorate
în cele două puncte finale. Punctele de control acţionează ca nişte „magneţi" care deformează linia dreaptă dintre cele
două puncte finale.

rând, cu puţină practică, de obicei puteţi să manipulaţi curba până ajunge la o formă apropiată de cea dorită.

curbele Bezier sunt foarte uşor de controlat.

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.

Pentru desenarea suprafeţe pline sunt utilizate 7 funcţii windows:


Funcţie Figura

Rectangle Dreptunghi cu colţuri drepte

Ellipse Elipsă

RoundRect Dreptunghi cu colţuri rotunjite


Arc pe circumferinţa unei elipse, având capetele unite printr-o
Chord
coardă
Pie
Suprafaţă de forma unei felii de plăcintă, reprezentând un
Polygon segment de elipsă.
PolyPolygon
Figură geometrică având mai multe laturi Mai multe figuri
geometrice cu mai multe laturi

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

Windows defineşte tipul HBRUSH ca variabilă handle a unei pensule.

Pentru a obţine variabila handle a unei pensulei de stoc se apelează funcţia GetStockObject:.

hBrush = GetStoCkObject (GRAY_BRUSH) ;

Odată selectată in contextual de dispozitiv cu ajutorul funcţiei SelectObject (hdc, hBrush)

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:

SetPolyFillMode (hdc, iMode) .

Umplerea suprafeţelor interioare

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.

Windows conţine patru funcţii pentru crearea pensulelor logice:

66. hBrush = CreateSolidBrush (rgbColor) ;


67. hBrush = CreateHatchBrush (iHatchStyle, rgbColor) – crearea unei pensule “haşurată" cu linii orizontale,
verticale sau oblice. 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.
68. hBrush = CreatePatternBrush (hBitmap) – crearea unei pensule proprii, bazată pe o imagine bitmap.
69. hBrush = CreateBrushIndirect (&logbrush) - funcţie care poate înlocui toate celelalte trei funcţii de
creare a pensulelor. Variabila logbrush este o structură de tip LOGBRUSH („logical brush") cu 3
câmpuri: lbStyle (UINT),lbColor (COLORREF),lbHatch (LONG).

Pentru a selecta pensula în contextul de dispozitiv se foloseşte funcţia SelectObject:


SelectObject (hdc, hBrush) ;

O pensulă creată poate fi ştearsă cu ajutorul funcţiei DeleteObject:


DeleteObject (hBrush) ;

Pentru a obţine informaţii despre o pensulă, se apelează funcţia GetObject:


GetObject (hBrush, sizeof (LOGBRUSH), (LPVOID) &logbrush) ;

unde variabila logbrush este o structură de tip LOGBRUSH („logical brush").

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;

În continuare se obţine o variabilă handle a contextului de dispozitiv şi se apelează funcţia GetTextMetrics:

hdc = GetDC(hwnd);

GetTextMetrics(hdc, &tm) ; ReleaseDC(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.

tmMaxCharWidth -lăţimea celui mai mare caracter al fontului.


Lăţimea medie a majusculelor poate fi obţinută calculând 150% din valoarea tmAveCharWidth.

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 ;

[alte linii de program] case WM_SIZE :

cxClient = LOWORD (lParam) ;

cyClient = HIWORD (lParam) ; return 0 ;


Barele de derulare se numără printre cele mai reuşite componente ale unei interfeţe grafice pentru mouse
având funcţia de a permite vizualizarea informaţiei pentru care este nevoie de mai mult spaţiu decât este disponibil
în zona client a ferestrei.

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 :

SetScrollPos (hwnd, iBar, iPos, bRedraw) ;

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.

23. Elemente de bază despre mouse. Funcţia GetSystemMetrics (SM_MOUSEPRESENT); cButtons =


GetSystemMetrics (SM_CMOUSEBUTTONS). Parametrul SM_SWAPBUTTON. Zona senzitivă a
indicatorului.
Windows 95 permite folosirea mouse-ului cu un buton, cu două butoane sau cu trei butoane, precum şi folosirea
unui joystick sau a unui creion optic, pentru simularea unui mouse cu un buton. Totuşi, cel mai utlizat este mouse-ul cu
trei butoane, devenit un standard de facto. Al doilea buton al mouse-ului este recomandat pentru apelarea „meniurilor
de context" - meniuri care apar în fereastră în afara barei de meniu - sau pentru operaţii speciale de tragere.
Pentru a determina dacă mouse-ul este prezent se foloseşte funcţia GetSystemMetrics având drept parametru
identificatorul SM_MOUSEPRESENT:
fMouse = GetSystemMetrics (SM_MOUSEPRESENT) ;
Variabila fMouse va avea valoarea TRUE (diferită de zero) dacă mouse-ul este instalat. Pentru determinarea
numărului de butoane ale mouse-ului instalat, folosiţi tot funcţia GetSystemMetrics:
cButtons = GetSystemMetrics (SM_CMOUSEBUTTONS) ;
Această funcţie returnează valoarea 0 dacă mouse-ul nu este instalat.
Utilizatorii care folosesc mâna stângă pot să inverseze butoanele mouse-ului folosind Panoul de control din
Windows. O aplicaţie poate să determine dacă butoanele mouse-ului au fost inversate apelând funcţia
GetSystemMetrics cu parametrul SM_SWAPBUTTON.
43. Folosirea peniţelor de stoc. Crearea, selectarea şi ştergerea peniţelor. Funcţiile CreatePen,
CreatePenIndirect, ExtCreatePen. Parametrii iPenStyle, iWidth, rgbColor.

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_CREATE, cream penita.


hPen = CreatePen (PS_SOLID, 1, 0);

Î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) ;

[funcţii de desenare a liniilor]

În timpul prelucrării mesajului WM_DESTROY putem să ştergem peniţele create:


DeleteObject (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.

45. Formatarea textului. Funcţia wsprintf. Funcţia GetSystemMetrics.


Deoarece dimensiunile fontului sistem nu se modifică în timpul unei sesiuni Windows, trebuie să apelam funcţia
GetTextMetrics o singură dată după lansarea în execuţie a programului. Un loc potrivit pentru acest apel este codul de
prelucrare a mesajului WM_CREATE din procedura de fereastră.

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

static int cxChar, 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.

Codul de prelucrare a mesajului WM_CREATE:

case WH_CREATE:

hdc = GetDC (hwnd); GetTextMetrics (hdc,

&tm); cxChar = tm.tmAveCharWidth; cyChar =

tm.tmHeight + tm.tmExternalLeading;

ReleaseDC (hwnd, hdc);

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.

În general, prelucrarea mesajului WM_PAINT se face astfel: case

WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

[apelarea unor funcţii GDI]

EndPaint (hwnd, &ps) ;

return 0 ;

49. Ignorarea tastaturii. Cursorul de intrare. Acţionări de taste şi caractere

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.

Acţionări de taste şi 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". 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.

50. În ce constă arhitectura orientată pe mesaje?

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.

51. În ce constă consecvenţa privind interfaţa cu utilizatorul?

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.

52. În ce constă interfaţa grafică independentă de dispozitiv?


Windows este o interfaţă grafică şi programele pentru Windows pot folosi toate avantajele oferite de elementele grafice
şi de textul formatat atât pentru ecran, cât şi pentru imprimantă. O interfaţă grafică nu are numai avantajul de a fi mai
atractivă, ci şi pe acela de a furniza utilizatorului o cantitate mai mare de informaţii.

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

Tipuri de apeluri de funcţii


În general, apelurile de funcţii GDI pot fi clasificate în mai multe categorii. Chiar dacă nu sunt foarte stricte şi există unele
suprapuneri, aceste categorii pot fi enunţate astfel:
- Funcţii care obţin (sau creează) şi eliberează (sau distrug) un context de dispozitiv. . Funcţiile GetDC şi
ReleaseDC vă permit să faceţi aceste lucruri în timpul prelucrării altor mesaje decât WM_PAINT, pe
când funcţiile BeginPaint şi EndPaint (deşi din punct de vedere tehnic fac parte din subsistemul USER
din Windows) sunt folosite în timpul prelucrării mesajului WM_PAINT.
- Funcţii care obţin informaţii despre contextul de dispozitiv.
- Funcţii care desenează ceva.
- Funcţii care stabilesc sau obţin atribute ale contextului de dispozitiv. Un „atribut" al contextului de
dispozitiv specifică modul de lucru al funcţiilor de desenare. De exemplu, folosiţi funcţia SetTextColor
ca să precizaţi culoarea textului afişat cu funcţia TextOut (sau cu o altă funcţie de afişare a textului).
- Funcţii care lucrează cu obiecte GDI.
Primitive GDI

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.

54. Mesaje CARACTER. Mesajul WM_CHAR. Mesaje pentru „caractere moarte".

. Există patru mesaje caracter:


Caractere „moarte"
Caractere
Caractere non-sistem WM_CHAR WM_DEADCHAR
Caractere sistem WM_SYSCHAR WM_SYSDEADCHAR

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.

Mesaje pentru „caractere moarte"


De obicei, programele pot să ignore mesajele WM_DEADCHAR si WM_SYSDEADCHAR. Pe unele tastaturi, în afară de
tastatura de tip american, o serie de taste sunt folosite pentru adăugarea semnelor diacritice la o literă. Acestea se
numesc „taste moarte" („dead keys") deoarece nu pot crea singure caractere. De exemplu, pe o tastatura germană, în
locul tastei +/= de pe tastatura americană se află o tastă moartă pentru accentul ascuţit ('') dacă nu este apăsată tasta
Shift, si pentru accentul grav (`) dacă este apăsată tasta Shift.
Atunci când utilizatorul apasă această tastă moartă, procedura de fereastră primeşte un mesaj WM_DEADCHAR
pentru care parametrul wParam conţine codul ASCII al semnului diacritic. Dacă utilizatorul apasă apoi 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. Ca urmare, programul nu trebuie să prelucreze mesajul
WM_DEADCHAR, deoarece mesajul WM_CHAR următor îi furnizează toate informaţiile necesare. Codul Windows se
ocupă chiar şi de tratarea erorilor: dacă tasta moartă este urmată de o literă care nu poate avea semnul diacritic
respectiv (cum ar fi litera „s"), procedura de fereastră primeşte două mesaje WM_CHAR - pentru primul parametrul
wParam conţine codul ASCII al semnului diacritic, iar pentru al doilea parametrul wParam conţine codul ASCII al literei
„s".

55. Mesaje de la barele de derulare. Structurarea programului pentru desenare. ScrollWindow

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.

Structurarea programului pentru desenare

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

Stânga WM_NCLBUTTON DOWN WM_NCLBUTTONUP WM_NCLBUTTONDBLCLK

Mijloc WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMBUTTONDBLCLK

Dreapta WM_NCRBUTTONDOWN WM_NCRBUTTONUP WM_NCRBUTTONDBLCLK

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 de testare a poziţiei

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ă

HTTRANSPARENT O fereastră acoperită de o altă fereastră

HTERROR Determină funcţia DefWindowProc să emită un semnal sonor


Dacă funcţia DefWindowProc generează un mesaj HTCLIENT în urma prelucrării mesajului WM_NCHITTEST,
Windows transformă coordonatele ecran în coordonate ale zonei client şi generează un mesaj pentru zona client.
Mesajele generează mesaje

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 :

PostQuitMessage (0) ; return

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

MK_SHIFT Tasta Shift este apăsată


MK_CONTROL Tasta Ctrl este apăsată

59. Mesajele de la timer.


Programul nostru avind un timer setat v-a primi la fiecare interval de timp specificat un singur mesaj , si anume
WM_TIMER, insa este important de tinut cont ca ceasul foloseste tactul de sitem sau mai bine spus intreruperile de
sistem ce au unele restrictii, întreruperi sunt generate la fiecare 54,925 milisecunde, adică de 18,2 ori pe secundă.
Intervalul de timp pe care îl specificaţi la apelarea funcţiei SetTimer este rotunjit la un multiplu întreg de tacturi de ceas.
De exemplu, prin împărţirea intervalului de 1000 de milisecunde la 54,925 rezultă 18,207, valoare care este rotunjită la
18 tacturi de ceas, ceea ce înseamnă, de fapt, un interval de 989 milisecunde.Insa intreruperile de ceas caatare nu pot fi
condsiderate ca fiind asincrone, insa mesajele WM_TIMER au o prioritate joasa, fiind in principiu foarte asemanatoare
cu mesajele WM_PAINT.

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.

61. Mesajele WM_CREATE, WM_PAINT şi WM_DESTROY.


WM_CREATE> Atunci când din main se apelează funcţia CreateWindow, Windows face ce are de făcut şi apelează
funcţia WndProc, transmiţându-i variabila handle a ferestrei şi mesajul WM_CREATE. WndProc prelucrează mesajul
WM_CREATE şi returnează controlul sistemului de operare.De cele mai dese ori WM_CREATE ce este practic primul
mesaj primit de procedura de fereastra este folosit pentru a initializa unele valori sau variabile necesare in viitorul
imediat al timpului de executie.
WM_PAINT> Acest mesaj este foarte important în programarea sub Windows, deoarece informează fereastra privind
faptul că o parte sau întreaga zonă client a acesteia este „invalidă" şi trebuie să fie redesenată. Aproape întotdeauna,
prelucrarea mesajului WM_PAINT începe prin apelarea funcţiei BeginPaint şi se termină cu apelarea funcţiei EndPaint cu
parametrii (hwnd, &ps),ps- PAINTSTRUCT conţine unele informaţii pe care programul le poate folosi pentru redesenarea
zonei client.
WM_DESTROY> Un alt mesaj important este WM_DESTROY. Acest mesaj indică faptul că sistemul de operare
desfăşoară un proces de distrugere a ferestrei pe baza unei comenzi de la utilizator. Mesajul este trimis atunci când
utilizatorul execută clic pe butonul Close, selectează opţiunea Close din meniul sistem sau apasă fastele Alt+F4.
Programul HELLOWIN răspunde la acest mesaj printr-o metodă standard, apelând funcţia PostQuitMessage (0) ;

62. Mesajul WM_PAINT. Dreptunghiuri valide şi invalide.


WM_PAINT> Acest mesaj este foarte important în programarea sub Windows, deoarece informează fereastra privind
faptul că o parte sau întreaga zonă client a acesteia este „invalidă" şi trebuie să fie redesenată. Aproape întotdeauna,
prelucrarea mesajului WM_PAINT începe prin apelarea funcţiei BeginPaint şi se termină cu apelarea funcţiei EndPaint cu
parametrii (hwnd, &ps),ps- PAINTSTRUCT conţine unele informaţii pe care programul le poate folosi pentru redesenarea
zonei client(inclusiv o structura de tip RECT ce inlcude dreptunghoil invalid).Cel mai important la mesajul WM_PAINT
este faptul ca el permite desenarea doar in zona invalida ce nu este altceva decit o regiune a zonei client ce a fost
acoperita de un meniu popup sau a fost suprapusa de o alta fereastra .. mutata in afara zonei ecran etc si spre final
valideaza zona in cauza.Desenarea fortata se poate efectua apelind funtia InvalidateRect(hwnd,lpRect,bErase); ce
invalideaza o zona si respectiv asugura desenarea in cadrul zonei date(daca pentru lpRect includem valoarea NULL
intreaga zona client va fi redesenata).

63. Modificarea textului unui buton.


Puteţi să modificaţi textul unui buton (sau al unei alte ferestre) prin apelarea funcţiei SetWindowText:
SetWindowText (hwnd, pszString) ;
unde hwnd este variabila handle a ferestrei al cărei text urmează să fie înlocuit, iar pszString este un pointer la un şir de
caractere terminat cu caracterul nul. Pentru o fereastră normală, acesta este textul care va fi afişat în bara de titlu.
Pentru un buton, acesta este textul afişat pe buton. De asemenea, puteţi să obţineţi textul ferestrei curente:
iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ;
Parametrul iMaxLength specifică numărul maxim de caractere care va fi copiat în bufferul adresat de pointerul pszBuffer.
Funcţia returnează lungimea şirului de caractere copiat. Puteţi să pregătiţi programul pentru un text de o anumită
lungime apelând mai întâi funcţia GetWindowTextLength:
iLength = GetWindowTextLength (hwnd) ;

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.

69. Parametrul PitchAndFamily. Funcţia SetTextAlign.

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:

cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;


Toate operaţiile de desenare în fereastră sunt făcute în timpul prelucrării mesajului WM_PAINT.

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:

SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

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:

cxChar + 22 * cxCaps + 40 * cxChar


Valoarea 40 x cxChar reprezintă lăţimea însumată a coloanelor doi şi trei. După apelarea funcţiei TextOut este apelată din
nou funcţia SetTextAlign, pentru a readuce la normal modul de aliniere a textului.

70. Pensule „haşurate". Stiluri de haşura. Funcţia CreatePatternBrush.


Puteţi să creaţi şi o pensulă „haşurată" cu linii orizontale, verticale sau oblice. Acest stil de pensule este folosit frecvent
pentru colorarea barelor din diagrame sau grafice şi pentru desenele executate de plottere. Funcţia care creează o pensulă
haşurată este:

hBrush = CreateHatchBrush (iHatchStyle, rgbColor) ;

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:

hBrush = CreatePatternBrush (hBitmap) ;

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

by BYTE (unsigned char)

i int

x, y int (folosit pentru coordonate) cx, cy int (folosit pentru dimensiuni pe

axele x si y, c vine de la „contor") b sau f BOOL (int); f vine de la „flag"

(indicator)
w WORD (unsigned short) l

LONG (long) fn funcţie s şir de

caractere sz sir de caractere terminat

cu zero h variabilă handle

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

HWND Variabilă handle a unei ferestre

HDC Variabilă handle a unui context de dispozitiv

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

Înregistrarea clasei de fereastră

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:

typedef struct tagWNDCLASSEX

{
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 ;

Apoi definiţi cele 12 câmpuri ale structurii şi apelaţi funcţia RegisterClassEx:

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.

cbSize reprezintă dimensiunea structurii.

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.hInstance = hinstance ; variabila handle a instanţei wndclass.hIcon

= LoadIcon (NULL, IDI_APPLICATION) ;

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.

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); precizează culoarea fondului zonei client a


ferestrelor create pe baza acestei clase. Prefixul hbr al numelui hbrBackground vine de la „handle to a brush".

Funcţia GetStockObject returnează o variabilă handle a unei pensule albe.

wndclass.lpszMenuName = NULL ; meniul ferestrei wndclass.IpszClassName


= szAppName ;

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

"The Hello Program", // titlul ferestrei

WS_OVERLAPPEDWINDOW, // stilul ferestrei

CW_USEDEFAULT, // poziţia iniţiala pe axa x

CW_USEDEFAULT, // poziţia iniţiala pe axa y

CW_USE DEFAULT, // dimensiunea iniţiala pe axa x

CW_USEDEFAULT, // dimensiunea iniţiala pe axa y

NULL, // variabila handle a ferestrei părinte

NULL, // variabila handle a meniului

hlnstance, // variabila handle a instanţei programului

NULL) ; // parametri de creare


Fereastra creată de acest program este o fereastră normală suprapusă, cu o bară de titlu; în partea stângă a barei de titlu se
află caseta cu meniul sistem; în partea dreaptă se află butoanele de mărire, de micşorare şi de închidere; fereastra are un
chenar îngroşat, care permite redimensionarea. Acesta este stilul standard al ferestre lor, numit WS_OVERLAPPEDWINDOW; în
funcţia CreateWindow îi corespunde comentariul „stilul ferestrei". „Titlul ferestrei" este textul afişat în bara de titlu.
Parametrii notaţi cu „poziţia iniţială pe axa x" şi „poziţia iniţială pe axa y" specifică poziţia iniţială a colţului din stânga-sus
al ferestrei, relativ la colţul din stânga-sus al ecranului. Prin folosirea identificatorului CW_USEDEFAULT pentru aceşti para
metri indicăm sistemului de operare să folosească valorile prestabilite pentru o fereastră suprapusă. Parametrii „dimensiunea
iniţială pe axa x" şi „dimensiunea iniţială pe axa y" specifică dimensiunile iniţiale ale ferestrei. Identificatorul CW_USEDEFAULT
indică sistemului de operare să folosească valorile prestabilite.

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:

ShowWindow (hwnd, iCmdShow) ;

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.