PW.55-68 ... 94-96.docx

13
55. Mesaje de la barele de derulare. Structurarea programului pentru desenare. ScrollWindow. Mesajele>Windows trimite procedurii de fereastră mesajul WM_VSCROLL ( WM_HSCROLL ) când utilizatorul execută clic pe bara de derulare sau trage caseta de derulare cu ajutorul mouse-ului. Se generează cel puţin două mesaje - unul la apăsarea butonului şi al doilea la eliberarea acestuia. Cuvântul mai puţin semnificativ al parametrului wParam care însoţeşte mesajul corespondent este un număr ce indica acţiunea efectuată cu ajutorul mouse-ului asupra barei de derulare. Aceste numere corespund unor identificatori care încep cu literele SB_ (de la „scroll bar"). Deşi unii dintre identificatori conţin cuvintele „UP" şi „DOWN" („sus" şi „jos"), identificatorii se aplică atât barelor de derulare verticale, cât şi celor orizontale.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. Pentru alte acţiuni executate asupra barei de derulare, cuvântul mai semnificativ al parametrului wParam poate fi ignorat. De asemenea, puteţi să ignoraţi parametrul lParam care, de obicei, este folosit pentru barele de derulare create în casetele de dialog. Documentaţia Windows indică faptul că în cuvântul mai puţin semnificativ al parametrului wParam pot fi transmise şi valorile SB_TOP sau SB_BOTTOM, corespunzătoare deplasării casetei de derulare în poziţia minimă, respectiv maximă. Totuşi, aceste mesaje nu sunt trimise niciodată în cazul barelor de derulare create ca parte a ferestrei unei aplicaţii. Tratarea mesajelor SB_THUMBTRACK şi SB_THUMBPOSITION este destul de dificilă si se recomanda doar pentru calculatoarele puternice ce pot suporta redesenarea rapida a zonei client. Structurarea programului>Structurarea programului cu barele de derulare poate fi facuta in diferite moduri , dar cel mai optimal este organizarea redesanarii doar in timpul prelucrarii mesajului WM_PAINT(in acest scop in cadrul mesajului de la bara de derulare plasam functia InvalidateRect(..) ce plaseaza in coada de mesaje un mesaj WM_PAINT , iar daca dorim ca prioritatea lui sa fie ridicata mai utilizam si funtia UpdateWindow(hwnd);).Deasemea trebuie sa avem grija ca informatiile necesare pentru bara de derulare sa fie la timp primite de catre program si ca insasi bara de derulare sa fie corect initializata(prin SetScrollRange(),SetScrollPos() etc). ScrollWindow> ScrollWindow (hwnd, xInc, yInc, pRect, pClipRect) ; Valorile xlnc şi ylnc specifică numărul de pixeli cu care se face derularea. Parametrii pRect(pointer spre o structura RECT ce contine granit zonei client ce trebuie redesenata) şi pClipRect(dreptunghiul de clliping) au valoarea NULL, daca trebuie derulată întreaga zonă client. Windows invalidează dreptunghiul din zona client „descoperit" de

Transcript of PW.55-68 ... 94-96.docx

Page 1: PW.55-68 ... 94-96.docx

55.Mesaje de la barele de derulare. Structurarea programului pentru desenare. ScrollWindow. Mesajele>Windows trimite procedurii de fereastră mesajul WM_VSCROLL ( WM_HSCROLL ) când utilizatorul execută clic pe bara de derulare sau trage caseta de derulare cu ajutorul mouse-ului. Se generează cel puţin două mesaje - unul la apăsarea butonului şi al doilea la eliberarea acestuia.Cuvântul mai puţin semnificativ al parametrului wParam care însoţeşte mesajul corespondent este un număr ce indica acţiunea efectuată cu ajutorul mouse-ului asupra barei de derulare. Aceste numere corespund unor identificatori care încep cu literele SB_ (de la „scroll bar"). Deşi unii dintre identificatori conţin cuvintele „UP" şi „DOWN" („sus" şi „jos"), identificatorii se aplică atât barelor de derulare verticale, cât şi celor orizontale.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. Pentru alte acţiuni executate asupra barei de derulare, cuvântul mai semnificativ al parametrului wParam poate fi ignorat. De asemenea, puteţi să ignoraţi parametrul lParam care, de obicei, este folosit pentru barele de derulare create în casetele de dialog. Documentaţia Windows indică faptul că în cuvântul mai puţin semnificativ al parametrului wParam pot fi transmise şi valorile SB_TOP sau SB_BOTTOM, corespunzătoare deplasării casetei de derulare în poziţia minimă, respectiv maximă. Totuşi, aceste mesaje nu sunt trimise niciodată în cazul barelor de derulare create ca parte a ferestrei unei aplicaţii.Tratarea mesajelor SB_THUMBTRACK şi SB_THUMBPOSITION este destul de dificilă si se recomanda doar pentru calculatoarele puternice ce pot suporta redesenarea rapida a zonei client. Structurarea programului>Structurarea programului cu barele de derulare poate fi facuta in diferite moduri , dar cel mai optimal este organizarea redesanarii doar in timpul prelucrarii mesajului WM_PAINT(in acest scop in cadrul mesajului de la bara de derulare plasam functia InvalidateRect(..) ce plaseaza in coada de mesaje un mesaj WM_PAINT , iar daca dorim ca prioritatea lui sa fie ridicata mai utilizam si funtia UpdateWindow(hwnd);).Deasemea trebuie sa avem grija ca informatiile necesare pentru bara de derulare sa fie la timp primite de catre program si ca insasi bara de derulare sa fie corect initializata(prin SetScrollRange(),SetScrollPos() etc). ScrollWindow> ScrollWindow (hwnd, xInc, yInc, pRect, pClipRect) ;Valorile xlnc şi ylnc specifică numărul de pixeli cu care se face derularea. Parametrii pRect(pointer spre o structura RECT ce contine granit zonei client ce trebuie redesenata) şi pClipRect(dreptunghiul de clliping) au valoarea NULL, daca 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.

56.Mesaje generate de mouse în afara zonei client. Mesajul de testare a poziţiei. Mesajele generează mesaje. 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 non-client 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). Mesajul de testare a pozitiei> Mesajul WM_NCHITTEST („non client hit test") este folosit

Page 2: PW.55-68 ... 94-96.docx

pentru verificarea poziţiei din care a fost generat mesajul si 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.Deasemnea mesajele pentru fereastra pot fi dezactivate :case WM_NCHITTEST

return (LRESULT) HTNOWHERE ; Mesajele genereaza 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. Daca executaţi dublu clic pe pictograma meniului sistem a unui program Windows se 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 DefWindowProc. Funcţia DefWindowProc îl prelucrează trimiţând procedurii de fereastră mesajul WM_CLOSE.

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_LBUTTONDOWNWM_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 non-client 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.

Page 3: PW.55-68 ... 94-96.docx

MK_LBUTTON Butonul din stânga al mouse-ului este apăsatMK_MBUTTON Butonul din mijloc al mouse-ului este apăsatMK_RBUTTON Butonul din dreapta al mouse-ului este apăsatMK_SHIFT Tasta Shift este apăsatăMK_CONTROL Tasta Ctrl este apăsată

58.Mesajele de la o fereastră child la una părinte.Mesajele de la o fereastra copil la una parinte pot fi observate foarte bine pe baza unei ferestre de tip „button” ce este copilul unei ferestre parinte.Atunci când executaţi clic pe un buton, controlul de tip fereastră descendent trimite mesajul WM_COMMAND către fereastra părinte. Programul interceptează mesajul WM_COMMAND cu valorile lParam şi wParam. Iată ce semnificaţie au acestea:LOWORD (wParam) Identificatorul ferestrei descendentHIWORD (wParam) Codul de înştiinţarelParam Variabila handle a ferestrei descendentDacă faceţi conversia unor programe scrise pentru versiunile pe 16 biţi ale sistemului de operare Windows, reţineţi că aceşti parametri au fost modificaţi în vederea adaptării la dimensiunea pointerilor pe 32 de biţi.Codul de înştiinţare este un cod de submesaj pe care fereastra descendent îl foloseşte pentru a transmite ferestrei părinte mai multe informaţii despre semnificaţia mesajului. Valorile pe care le pot avea aceste coduri sunt definite în fişierele antet definite în Windows:BN_CLICKED;BN_PAINT;BN_HILITE;BN_UNHILITE;BN_DISABLE;BN_DOUBLECLICKED;

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.Pentru acţionările de taste care generează caractere afişabile, Windows trimite programului atât mesaje pentru acţionarea de taste, cât şi mesaje pentru caractere. Unele taste nu generează caractere. Astfel de taste sunt Shift, tastele funcţionale, tastele de deplasare şi tastele speciale, precum Insert şi Delete. În cazul acestor taste, Windows generează numai mesaje pentru acţionari de taste. 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

Page 4: PW.55-68 ... 94-96.docx

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. În majoritatea cazurilor, contorul de repetare are valoarea 1), codul de scanare OEM(codul de scanare al tastaturii, generat de componentele hardware deobicei ignorat, indicatorul flag pentru taste extinse are valoarea 1 dacă mesajul este generat de una dintre tastele suplimentare de pe tastatura IBM extinsă.), codul de context(are valoarea 1 dacă este apăsată tasta Alt), starea anterioară a tastei(are valoarea 0 dacă tasta nu a fost anterior apăsată, şi valoarea 1 dacă tasta a fost apăsată) şi starea de tranziţie(are valoarea 0 dacă tasta este apăsată şi valoarea 1 dacă tasta este eliberată).

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) ;Această funcţie inserează în coada de aşteptare a programului un mesaj WM_QUIT. Am spus anterior că funcţia GetMessage returnează o valoare diferită de zero în cazul preluării oricărui mesaj în afară de WM_QUIT. Atunci când preia din coada de aşteptare un mesaj WM_QUIT, funcţia GetMessage returnează valoarea 0, ceea ce determină ieşirea din ciclul de tratare a mesajelor din funcţia WinMain şi închiderea programului.

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

Page 5: PW.55-68 ... 94-96.docx

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

64.Moduri de desenare. Operaţii rastru (ROP - raster operation). Funcţiile SetROP2, iDrawMode, GetROP2.Imaginaţi-vă o cale prin care să puteţi folosi aceeaşi peniţă ca să desenaţi o linie albă pe fond negru, dar şi o linie neagră pe fond alb, ştiind ce culoare are fondul. Dacă vă este utilă această facilitate, puteţi să o obţineţi prin schimbarea modului de desenare. Atunci când foloseşte o peniţă pentru desenarea unei linii, Windows face de fapt o operaţie booleană între pixelii peniţei şi pixelii de pe suprafaţa destinaţie. Efectuarea operaţiei booleene între pixeli se numeşte „operaţie rastru"(ROP). Deoarece desenarea unei linii implică numai două modele de pixeli (peniţa şi destinaţia), operaţia booleană se numeşte „operaţie rastru binară" sau ROP2. Windows defineşte 16 coduri ROP2 care specifică modul de combinare între pixelii peniţei şi pixelii suprafeţei, în contextul de dispozitiv prestabilit, modul de desenare definit este R2_COPYPEN, ceea ce înseamnă că Windows copiază pixelii peniţei pe suprafaţa destinaţie - adică modul normal în care suntem obişnuiţi să funcţioneze o peniţă. Există alte 15 coduri ROP2.Puteţi să selectaţi un nou mod de desenare în contextul de dispozitiv astfel:SetROP2 (hdc, iDrawMode) ;unde parametrul iDrawMode este una dintre valorile din coloana „Mod de desenare" a tabelului ce contine toate modurile de desenare.Puteţi să obţineţi modul curent de desenare astfel:iDrawMode = GetROP2 (hdc) ;Exemple de moduri de desenare : Modul R2_NOTCOPYPEN desenează cu alb dacă peniţa este neagră şi cu negru dacă peniţa este albă. Modul R2_BLACK desenează întotdeauna cu negru, indiferent de culoarea peniţei şi a destinaţiei. În mod similar, modul R2_WHITE desenează întotdeauna cu alb. Modul R2_NOP este o „operaţie nulă" - destinaţia rămâne nemodificată.

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

Extensiile ferestrei şi ale vizorului depind de modul de mapare şi de raportul de afişare a dispozitivului. Aşa cum am menţionat anterior, extensiile nu sunt impor tante ca atare, având o

Page 6: PW.55-68 ... 94-96.docx

semnificaţie numai exprimate ca rapoarte.Importanta este trecerea la noile senduri de crestere a axelor de coordonate , la axa y ea fiind inversa celei obisnuite la MM_TEXT, pentru facilitate putem muta originea sistemului in centrul ferestrei : SetViewportOrgEx (hdc, cxClient/2, cyClient/2, NULL) ; daca ar fi sa mutam originea ferestrei am fi nevoiti sa transformam puctele fizice in cele logice pentru a fi transmise functiei SetWindowOrgEx (hdc, -pt.x/2, -pt.y/2, NULL) ;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ânga-jos 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". Windows trebuie să transforme „unităţile logice" în „unităţi de dispozitiv", adică în pixeli. Această transformare este guvernată de modul de mapare, de originile ferestrei, ale vizorului şi de extensiile ferestrei şi ale vizorului. De asemenea, modul de mapare stabileşte şi orientarea axelor x şi y, adică determină sensul în care cresc valorile coordonatelor x şi y. Puteţi să selectaţi modul de mapare folosind funcţia SetMapMode:SetMapMode (hdc, iMapHode) ;unde iMapMode este unul dintre cei opt identificatori definiţi pentru modurile de mapare. Puteţi să obţineţi modul de mapare curent folosind funcţia GefMapMode:iMapMode = GetMapMode (hdc) ;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,

Page 7: PW.55-68 ... 94-96.docx

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.Sistemele de coordonate ale dispozitivului> Deşi în general am lucrat doar în zona client a ferestrei, în anumite situaţii Windows foloseşte alte două sisteme de coordonate de dispozitiv. În toate sistemele de coordonate de dispozitiv sunt folosiţi pixelii ca unitate de măsură. Valorile de pe axa orizontală (x) cresc de la stânga la dreapta iar valorile de pe axa verticală (y) cresc de sus în jos. Atunci când folosim întregul ecran, spunem că lucrăm în „coordonate ecran". Colţul din stânga-sus este punctul de coordonate (0, 0). Dacă folosiţi funcţia CreateDC cu parametrul DISPLAY ca să obţineţi un context de dispozitiv pentru întregul ecran, atunci coordonatele logice specificate la apelarea funcţiilor GDI vor fi mapate la coordonatele ecranului. „Coordonatele de fereastră" se referă la întreaga fereastră a ecranului, inclusiv bara de titlu, meniu, barele de derulare şi chenarul ferestrei. Pentru o fereastră normală, punctul (0, 0) este colţul din stânga-sus al chenarului de redimensionare. Al treilea sistem de coordonate de dispozitiv - cu care vom lucra cel mai des -foloseşte „coordonatele zonei client". Punctul (0,0) este colţul din stânga-sus al zonei client. Puteţi să transformaţi coordonatele zonei client în coordonatele ecranului şi invers folosind funcţiile ClientToScreen şi ScreenToClient.Vizorul şi fereastra> Pentru vizor se folosesc coordonatele de dispozitiv (pixeli). De cele mai multe ori, vizorul coincide cu zona client a ferestrei, dar poate să însemne şi coordonatele întregii ferestre sau coordonatele întregului ecran, dacă aţi obţinut contextul de dispozitiv prin apelarea funcţiilor GetWindowDC sau CreateDC. Punctul de coordonate (0, 0) este colţul din stânga-sus al zonei client (sau al ferestrei, ori al ecranului). Valorile coordonatei x cresc către dreapta, iar valorile coordonatei y cresc în jos.Pentru fereastră se utilizează coordonatele logice, care pot fi,exprimate în pixeli, milimetri, inci sau orice altă unitate de măsură doriţi. Coordonatele logice ale ferestrei sunt specificate la apelarea funcţiilor GDI.Pentru toate modurile de mapare, Windows transformă coordonatele ferestrei (coordonate logice) în coordonate ale vizorului (coordonate de dispozitiv) folosind două formule:

Windows poate să transforme şi coordonatele vizorului (coordonate de dispozitiv) în coordonate ale ferestrei (coordonate logice):

DPtoLP (hdc, pPoints, iNumber) ;//Converteste punctele de dispozitiv in logiceLPtoDP (hdc, pPoints, iNumber) ;//Converteste punctele logice in cele de dipozitivFolosirea modului de mapare MM_TEXT> Pentru modul de mapare MM_TEXT, originile şi extensiile prestabilite sunt următoarele:Originea ferestrei: (0, 0) Poate fi modificată Originea vizorului: (0, 0) Poate fi modificată Extensia ferestrei: (1, 1) Nu poate fi modificată Extensia vizorului: (1, 1) Nu poate fi modificatăRaportul din extensia ferestrei şi extensia vizorului este 1, aşa că nu este necesară nici o operaţie de scalare pentru transformarea coordonatelor logice în coordonate de dispozitiv. În general, citim textul de la stânga spre dreapta şi de sus în jos, iar în modul de mapare MM_TEXT, valorile cresc în acelaşi sens Windows furnizează funcţiile SetViewportOrgEx şi SetWindowOrgEx pentru modificarea originii vizorului şi a ferestrei. De exemplu, să presupunem că zona client are lăţimea cxClient şi înălţimea cyClient. Dacă vreţi ca punctul logic de coordonate (0, 0) să se afle în centrul zonei client, puteţi să apelaţi funcţia următoare:

Page 8: PW.55-68 ... 94-96.docx

SetViewportOrgEx (hdc, cxClient/2, cyClient/2, NULL) ;Totuşi, modul de mapare MM_TEXT prezintă o mică problemă: de obicei, într-un sistem de coordonate cartezian, valorile de pe axa y cresc în sus, pe când în modul de mapare MM_TEXT acestea cresc în jos. In acest sens, modul de mapare MM_TEXT este un caz izolat, această problemă fiind corectată de celelalte cinci moduri de mapare.

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 acesteiahdc = GetDC (hwnd);(alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga zona clienthdc = GetWindowDC (hwnd);[alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga fereastra … ce poate creaa efecte nedoriteFuncţ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);

Page 9: PW.55-68 ... 94-96.docx

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

Intrebarile din C#94. CONCEPTE DE BAZĂ ALE PROGRAMĂRII VIZUALE.

Simplitatea: Interfaţa trebuie să fie cât mai uşor de înţeles şi de învăţat de către utilizator şi să permită acestuia să efectueze operaţiile dorite în timp cât mai scurt. În acest sens, este vitală culegerea de informaţii despre utilizatorii finali ai aplicaţiei şi a modului în care aceştia sunt obişnuiţi să lucreze.Poziţia controalelor: Locaţia controalelor dintr-o fereastră trebuie să reflecte importanţa relativă şi frecvenţa de utilizare. Astfel, când un utilizator trebuie să introducă nişte informaţii – unele obligatorii şi altele opţionale – este indicat să organizăm controalele astfel încât primele să fie cele care preiau informaţii obligatorii.Consistenţa: Ferestrele şi controalele trebuie să fie afişate după un design asemănător („template”) pe parcursul utilizării aplicaţiei. Înainte de a implementa interfaţa, trebuie decidem cum va arăta aceasta, să definim „template”-ul.Estetica: Interfaţa trebuie să fie pe cât posibil plăcută şi atrăgătoare.

95. MEDIUL DE DEZVOLTARE VISUAL C# (INTERFEŢA).Mediul de dezvoltare Microsoft Visual C# dispune de instrumente specializate de proiectare, ceea ce permite crearea aplicaţiilor în mod interactiv, rapid şi uşor. Pentru a construi o aplicaţie Windows (FileNew Project) se selectează ca template Windows Forms Application.O aplicaţie Windows conţine cel puţin o fereastră (Form) în care se poate crea o interfaţă cu utilizatorul aplicaţiei.Componentele vizuale ale aplicaţiei pot fi prelucrate în modul Designer (Shift+F7) pentru a plasa noi obiecte, a le stabili proprietăţile etc. Codul „din spatele” unei componente vizuale este accesibil în modul Code (F7).În fereastra Solution Explorer sunt afişate toate fişierele pe care C# 2008 Express Edition le-a inclus în proiect. Form1.cs este formularul creat implicit ca parte a proiectului. Fişierul Form1.cs conţine un formular (fereastra Form1 derivata din clasa Form) care este reprezentată în formatul Design (Form1.cs[Design]), adică într-un format in care se poate executa proiectare vizuală, prin inserarea controalelor necesare selectate din fereastra Toolbox, care se activează atunci când este „atinsă” cu mouse-ul. Fişierul Form1.cs poate fi văzut ca fişier text sursă prin selectarea lui în fereastra Solution Explorer, clic dreapta cu mouse-ul şi selecţia opţiunii View Code.Fereastra Properties (Ctrl+W,P) este utilizată pentru a schimba proprietăţile obiectelor.Toolbox (Ctrl+W,X) conţine controale standard drag-and-drop şi componente utilizate în crearea aplicaţiei Windows. Controalele sunt grupate în categoriile logice din imaginea alăturată. Ferestrele care sunt afişate in fereastra principală se pot stabili prin selecţie din meniul View.La crearea unei noi aplicaţii vizuale, Microsoft Visual C# 2008 Express Edition generează un spaţiu de nume care conţine clasa statică Program, cu metoda statică ce constituie punctul de intrare (de lansare) a aplicaţiei:static void Main(){ ...Application.Run(new Form1());}Clasa Application este responsabilă cu administrarea unei aplicaţii Windows, punând la dispoziţie proprietăţi pentru a obţine informaţii despre aplicaţie, metode de lucru cu aplicaţia şi altele. Toate metodele şi proprietăţile clasei Application sunt statice. Metoda Run creează un formular implicit, aplicaţia răspunzând la mesajele utilizatorului până când formularul va fi închis. Compilarea modulelor aplicaţiei şi asamblarea lor într-un singur fişier „executabil” se realizează cu ajutorul opţiunilor din meniul Build, uzuală fiind Build Solution (F6).Odată implementată, aplicaţia poate fi lansată, cu asistenţă de depanare sau nu (opţiunile Start din meniul Debug). Alte facilităţi de depanare pot fi folosite prin umărirea pas cu pas, urmărirea până la puncte de întrerupere etc. (celelalte opţiuni ale meniului Debug).

Page 10: PW.55-68 ... 94-96.docx

Ferestre auxiliare de urmărire sunt vizualizate automat în timpul procesului de depanare, sau pot fi activate din submeniul Windows al meniului Debug.Proiectarea vizuală a formularului se poate face inserând controale selectate din fereastra de instrumente (Toolbox) şi setând proprietăţile acestora.

94.ELEMENTELE POO ÎN CONTEXT VIZUAL.Elementele programarii orientate pe obiecte sunt pe larg utilizate si in contextul vizual chiar daca nu sunt deodata sesizabile.Exemplul perfect este insasi managementul unui proiect WindowsForm in C#.Dupa cum ne amintim pe ecranul aplicatiei putem gasi mai multe elemente … daca e sa le analizam atunci putem vedea elementele POO.Insasi fereastra SolutionExplorer ce la prima vedere contine doar codul nostru , in realitate reprezinta un organizator de fisiere ce contin clasele , formele etc (formele apropo sunt iarasi obiecte , deci iarasi vine vorba despre POO).Cel mai reprezentative elemente sunt Toolbox’ul si Proprietatile.Din Toolbox putem selecta diferite obiecte ce le putem aranja dupa dorinta in fereastra noastra(asa numita forma) , iar la general vobind în Toolbox există toate tipurile de controale care îi sunt necesare unui programator pentru a realiza o aplicaţie. Cele mai multe controale sunt obiecte de clase derivate din clasa System.Windows.Forms.Control. Datorită acestui fapt multe dintre proprietăţile şi evenimentele diverselor controale vor fi identice. Fereastra Properties, din interfaţa mediului de programare, vom observa că va conţine atât proprietăţile cât şi evenimentele ataşate controalelor. Proprietăţile controalelor, sunt moştenite sau supraînscrise din clasa de bază Control.In acest mod vedem ca Programarea vizuala este nu altceva decit aceeasi programare orientata peobiecte doar ca simplificata si cu mult mai accesibila.