PW 66-80.docx
-
Author
mariana-butucea -
Category
Documents
-
view
213 -
download
0
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