PW 66-80.docx

of 22 /22
66. Modurile de mapare. Coordonate de dispozitiv şi coordonate logice. Sistemele de coordonate ale dispozitivului. Vizorul şi fereastra. Folosirea modului de mapare MM_TEXT. Modurile de mapare Un atribut al contextului de dispozitiv care afectează aproape toate operaţiile de desenare din zona client este „modul de mapare" („mapping mode"). Alte patru atribute ale contextului de dispozitiv - originea ferestrei, originea vizorului (viewport), extensia ferestrei şi extensia vizorului - sunt strâns legate de modul de mapare. Majoritatea funcţiilor GDI primesc coordonate sau dimensiuni ca parametri. Iată, ca exemplu, funcţia TextOut: TextOut (hdc, x, y, szBuffer, iLength) ; Parametrii x şi y indică poziţia în care începe textul. Parametrul x reprezintă poziţia pe axa orizontală, iar parametrul y reprezintă poziţia pe axa verticală. Deseori, pentru indicarea acestui punct este folosită notaţia (x, y). În 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. Windows defineşte opt moduri de mapare. Acestea sunt prezentate în tabelul următor, folosind identificatorii definiţi în fişierele antet din Windows: Mod de mapare Unităţi logice Creşterea valorilor axax axay MM_TEXT Pixel Spre dreapta În jos MM_LOMETRIC 0,1 mm Spre dreapta În sus MM_HIMETRIC 0,01mm Spre dreapta În sus MM_LOENGLISH 0,01 mei Spre dreapta În sus MM_HIENGLISH 0,001 inci Spre dreapta Însus MM_TWIPS 1/1440 inci Spre dreapta În sus MM_ISOTROPIC Arbitrar (x = y) Selectabil Selectabil MM_ANISOTROPIC Arbitrar (x != y) Selectabil Selectabil 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) ; Modul de mapare prestabilit este MM_TEXT. În acest mod de mapare unităţile logice sunt aceleaşi cu unităţile fizice, ceea ce vă permite (sau, privind dintr-o altă perspectivă, vă forţează) să lucraţi în pixeli. Într-un apel al funcţiei TextOut care arată astfel: TextOut (hdc, 8, 16, szBuffer, iLength) ; textul începe la o distanţă de opt pixeli faţă de marginea din stânga a zonei client şi de 16 pixeli faţă de marginea de sus a acesteia.

Embed Size (px)

Transcript of PW 66-80.docx

66. Modurile de mapare. Coordonate de dispozitiv i coordonate logice. Sistemele de coordonate ale dispozitivului. Vizorul i fereastra. Folosirea modului de mapare MM_TEXT.

Modurile de mapareUn atribut al contextului de dispozitiv care afecteaz aproape toate operaiile de desenare din zona client este modul de mapare" (mapping mode"). Alte patru atribute ale contextului de dispozitiv - originea ferestrei, originea vizorului (viewport), extensia ferestrei i extensia vizorului - sunt strns legate de modul de mapare.Majoritatea funciilor GDI primesc coordonate sau dimensiuni ca parametri. Iat, ca exemplu, funcia TextOut:TextOut (hdc, x, y, szBuffer, iLength) ;Parametrii x i y indic poziia n care ncepe textul. Parametrul x reprezint poziia pe axa orizontal, iar parametrul y reprezint poziia pe axa vertical. Deseori, pentru indicarea acestui punct este folosit notaia (x, y).n funcia TextOut i, de fapt, n toate funciile GDI, coordonatele sunt furnizate n uniti logice". Windows trebuie s transforme unitile logice" n uniti 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 stabilete i orientarea axelor x i y, adic determin sensul n care cresc valorile coordonatelor x i y.Windows definete opt moduri de mapare. Acestea sunt prezentate n tabelul urmtor, folosind identificatorii definii n fiierele antet din Windows:

Mod de mapareUniti logiceCreterea valorilor axax axay

MM_TEXTPixelSpre dreaptan jos

MM_LOMETRIC0,1 mmSpre dreaptan sus

MM_HIMETRIC0,01mmSpre dreaptan sus

MM_LOENGLISH0,01 meiSpre dreaptan sus

MM_HIENGLISH0,001 inciSpre dreaptansus

MM_TWIPS1/1440 inciSpre dreaptan sus

MM_ISOTROPICArbitrar (x = y)SelectabilSelectabil

MM_ANISOTROPICArbitrar (x != y)SelectabilSelectabil

Putei s selectai modul de mapare folosind funcia SetMapMode:SetMapMode (hdc, iMapHode) ;unde iMapMode este unul dintre cei opt identificatori definii pentru modurile de mapare. Putei s obinei modul de mapare curent folosind funcia GefMapMode:iMapMode = GetMapMode (hdc) ;Modul de mapare prestabilit este MM_TEXT. n acest mod de mapare unitile logice sunt aceleai cu unitile fizice, ceea ce v permite (sau, privind dintr-o alt perspectiv, v foreaz) s lucrai n pixeli. ntr-un apel al funciei TextOut care arat astfel:TextOut (hdc, 8, 16, szBuffer, iLength) ;textul ncepe la o distan de opt pixeli fa de marginea din stnga a zonei client i de 16 pixeli fa de marginea de sus a acesteia.

Coordonate de dispozitiv i coordonate logicemodul de mapare fiind un atribut al contextului de dispozitiv, are efect numai atunci cnd folosii funcii GDI care primesc o variabil handle a contextului de dispozitiv ca parametru. GetSystemMetrics nu este o funcie GDI, aa c va returna n continuare dimensiunile n uniti de dispozitiv, adic n pixeli. Dei GetDeviceCaps este o funcie GDI care primete ca parametru o variabil handle a contextului de dispozitiv, Windows continu s returneze uniti de dispozitiv pentru identificatorii HORZRES i VERTRES, deoarece unul dintre scopurile acestei funcii este s furnizeze programului dimensiunea n pixeli a dispozitivului.Totui, valorile din structura TEXTMETRIC pe care le obinei prin apelarea funciei GetTextMetrics sunt furnizate n uniti logice. Dac modul de mapare este MM_LOENGLISH n momentul apelrii funciei, GetTextMetrics returneaz limea i nlimea caracterelor, n sutimi de inci. Atunci cnd apelai funcia GetTextMetrics ca s obinei nlimea i limea caracterelor, modul de mapare trebuie s fie acelai cu cel pe care l vei folosi atunci cnd afiai textul pe baza acestor dimensiuni

Sistemele de coordonate ale dispozitivuluiAtunci cnd folosim ntregul ecran, spunem c lucrm n coordonate ecran". Colul din stnga-sus este punctul de coordonate (0, 0). Coordonatele ecran sunt folosite n mesajul WM_MOVE (pentru alte ferestre dect ferestrele descendent) i n urmtoarele funcii Windows: CreateWinriow i MoveWindow (ambele pentru alte ferestre dect ferestrele descendent), GetMessagePos, GetCursorPos, SetCursorPos, GetWindowRect, WindowFromPoint i SetBrushOrgEx. 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 colul din stnga-sus al chenarului de redimensionare. Coordonatele de fereastr sunt folosite mai rar n Windows, dar dac obinei un context de dispozitiv cu ajutorul funciei GetWindowDC, atunci coordonatele logice specificate la apelarea funciilor GDI vor fi mapate la coordonatele ferestrei.Al treilea sistem de coordonate de dispozitiv -folosete coordonatele zonei client". Punctul (0,0) este colul din stnga-sus al zonei client. Dac obinei un context de dispozitiv cu ajutorul funciei GetDC sau al funciei BeginPaint, atunci coordonatele logice specificate Ia apelarea funciilor GDI vor fi mapate la coordonatele zonei client.Putei s transformai coordonatele zonei client n coordonatele ecranului i invers folosind funciile ClientToScreen i ScreenToClient. De asemenea, putei obinei poziia i dimensiunea ntregii ferestre n coordonate ecran folosind funcia GetWindowRect.

Vizorul i fereastraModurile de mapare definite n Windows stabilesc modul n care sunt mapate coordonatele logice specificate n funciile GDI la coordonatele de dispozitiv, pe baza faptului c sistemul de coordonate de dispozitiv folosit depinde de funcia folosit pentru obinerea contextului de dispozitiv. se spune c modul de mapare definete maparea coordonatelor de fereastr" (window) -coordonate logice - la coordonatele vizorului (viewport) - coordonate de dispozitiv.n alte limbaje pentru interfeele grafice, termenul viewport se refer la o regiune de decupare (clipping region). Termenul window definete, n general, zona pe care o ocup un program pe ecran. n timpul discuiilor de fa va trebui s renunm la vechile definiii ale acestor termeni.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 ai obinut contextul de dispozitiv prin apelarea funciilor GetWindowDC sau CreateDC. Punctul de coordonate (0, 0) este colul din stnga-sus al zonei client (sau al ferestrei, ori al ecranului). Valorile coordonatei x cresc ctre 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 msur dorii. Coordonatele logice ale ferestrei sunt specificate la apelarea funciilor GDI.Pentru toate modurile de mapare, Windows transform coordonatele ferestrei (coordonate logice) n coordonate ale vizorului.Windows poate s transforme i coordonatele vizorului (coordonate de dispozitiv) n coordonate ale ferestrei (coordonate logice.Windows include dou funcii care v permit s convertii punctele de dispozitiv n puncte logice i invers. Funcia urmtoare convertete punctele de dispozitiv n puncte logice:DPtoLP (hdc, pPoints, iNumber) ;Variabila pPoints este o matrice de structuri POINT, iar iNumber este numrul de puncte ce urmeaz s fie convertite. Vei vedea c aceast funcie este foarte util pentru convertirea dimensiunii zonei client obinute prin apelarea funciei GetClientRect (care returneaz valorile n uniti de dispozitiv) n coordonate logice:GetClientRect (hwnd, &rect);DPtoLP (hdc, (PPoint) &rect, 2);Funcia urmtoare convertete punctele logice n puncte de dispozitiv:LPtoDP (hdc, pPoints, iNumber) ;Folosirea modului de mapare MM_TEXTPentru modul de mapare MM_TEXT, originile i extensiile prestabilite sunt urmtoarele: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 modificatRaportul din extensia ferestrei i extensia vizorului este 1, aa c nu este necesar nici o operaie de scalare pentru transformarea coordonatelor logice n coordonate de dispozitiv. Acest mod de mapare se numete mapare de tip text", nu fiindc este cea mai potrivit pentru text, ci datorit orientrii axelor. n general, citim textul de la stnga spre dreapta i de sus n jos, iar n modul de mapare MM_TEXT, valorile cresc n acelai sens:

Windows furnizeaz funciile SetViewportOrgEx i SetWindowOrgEx pentru modificarea originii vizorului i a ferestrei. Aceste funcii au ca efect deplasarea axelor, astfel nct punctul de coordonate (0, 0) nu se mai refer la colul din stnga-sus al ecranului. n general, vei folosi ori funcia SetViewportOrgEx, ori SetWindowOrgEx, dar nu pe amndou.De exemplu, s presupunem c zona client are limea cxClient i nlimea cyClient. Dac vrei ca punctul logic de coordonate (0, 0) s se afle n centrul zonei client, putei s apelai funcia urmtoare:SetViewportOrgEx (hdc, cxClient/2, cyClient/2, NULL) ;Argumentele funciei SetViewportEx sunt exprimate ntotdeauna n uniti de dispozitiv. Punctul logic (0, 0) va fi acum mapat la punctul .de dispozitiv (cxClient/2, cyClient/2). Din acest moment folosii zona client ca i cum ar avea urmtorul sistem de coordonate:

Valorile logice ale axei x sunt cuprinse n intervalul de la -cxClient/2 la +cxClient/2 iar valorile logice ale axei y sunt cuprinse n intervalul de la -cyClient/2 la +cyClient/2. Colul din dreapta-jos al zonei client are coordonatele (cxClient/2, cyClient/2). Dac vrei s afiai text ncepnd din colul din stnga-sus al zonei client, care are coordonatele de dispozitiv (0, 0), trebuie s folosii coordonate logice negative:TextOut (hdc, -cxClient/2, -cyClient/2, "Hello", 5) ;

67. Obinerea informaiilor despre culori. PLANES, BITSPIXEL, NUMCOLORS: Tipul COLORREF.

Obinerea informaiilor despre culoriPentru afiarea culorilor este nevoie de mai muli bii. Cu ct se folosesc mai muli bii, cu att pot fi afiate mai multe culori. Sau, mai precis, numrul culorilor care pot fi afiate simultan este egal cu 2 la o putere egal cu numrul de bii folosii. De obicei, biii sunt organizai n planuri de culori - un plan pentru rou, un plan pentru verde, unul pentru albastru i unul pentru intensitatea culorii. Adaptoarele video cu 8, 16 sau 24 de bii pentru fiecare pixel au un singur plan de culoare, n care un numr de bii adiaceni reprezint culoarea fiecrui pixel.Funcia GetDeviceCaps v permite s determinai modul de organizare a memoriei n adaptoarele video i numrul de culori care pot fi reprezentate. Apelul de mai jos returneaz numrul de planuri de culoare:iPlanes = GetDeviceCaps (hdc, PLANES);Apelul urmtor returneaz numrul de bii de culoare folosii pentru fiecare pixel:iBitsPixel = GetDeviceCaps (hdc, BITSPIXEL)Majoritatea adaptoarelor video care pot afia culori folosesc fie mai multe planuri de culoare, fie mai muli bii de culoare pentru fiecare pixel, dar nu pe amndou; cu alte cuvinte, unul dintre cele dou apeluri de mai sus va returna valoarea 1. Numrul de culori care pot fi redate de o plac video se poate calcula cu formula urmtoare:iColors = 1