Modurile de afișare metrice

Modurile de afișare metrice

y = cyChar * (1 + i); [ieșire text]

EndPaint (hwnd, ps); retur 0;

Acum, calcularea coordonatei y pentru funcția TextOut nu necesită valoarea iVscrollPos. Aceasta înseamnă că puteți pune funcții de ieșire text într-o subrutină fără a trece valoarea iVscrollPos la ea. deoarece ajustăm textul prin schimbarea originii ferestrei.







Dacă aveți experiență cu un sistem de coordonate dreptunghiular (cartesian), mutarea punctului logic (0, 0) în centrul spațiului de lucru, așa cum am făcut mai devreme, vă poate părea utilă. Cu toate acestea, există o mică problemă în modul MM_TEXT: de obicei în sistemul de coordonate cartezian, valoarea coordonatei y crește pe măsură ce vă deplasați în sus și în MM_TEXT - în jos. În acest sens, modul MM_TEXT este oarecum ciudat, în timp ce următoarele cinci moduri de afișare o fac corect.

Windows include cinci moduri de afișare pentru exprimarea coordonatelor logice în unități fizice. Deoarece coordonatele logice ale axelor x și y sunt convertite în aceleași unități fizice de măsură, aceste moduri de afișare vă ajută să desenați cercuri rotunde și pătrate pătrate.

Cinci moduri de cartografiere metrice sunt enumerate mai jos în ordine ascendentă de precizie. Pentru comparație, dimensiunile unităților logice în inci și milimetri (mm) sunt date în cele două coloane din dreapta.

Pentru a vă da o idee despre modul în care modul de rezoluție MM_TEXT se corelează cu aceste permisiuni, de exemplu, că un afișaj VGA standard fiecare pixel din care are o dimensiune de 0.325 mm în lățime și înălțime, VGA fizică - coordonate mai rugoasă decât coordonate logice în orice din modurile de afișare metrice.

Într-o imprimantă laser cu o rezoluție de 300 puncte / inch, fiecare pixel are o dimensiune de 0,0033 inci - o rezoluție mai mare decât în ​​modurile și MM_LOENGLISH MM_LOMETRIC, dar mai mic decât în ​​modurile

MM_HIENGLISH, MM_TWIPS și MM_HIMETRIC.

Coordonatele și lungimile specificate în mod prestabilit sunt enumerate mai jos:

Originea originii ferestrei: (Originea ferestrei)

Poate fi schimbat

Originea zonei de ieșire este: (Originea ferestrei)

Poate fi schimbat

Lungimea ferestrei: (extinderea ferestrelor)

Nu pot fi schimbate

Dimensiunea zonei de ieșire: (extinderea ferestrei)

Nu pot fi schimbate

Lungimea ferestrei și a zonei de ieșire depind de modul de afișare și de raportul de aspect al dispozitivului (raportul înălțime / lățime pixel). Așa cum am menționat mai devreme, lungimile în sine nu au sens. Are sens doar atitudinea lor. Dă formulele pentru transformarea coordonatelor încă o dată:

xViewport = (xWindow - xWinOrg) x (xViewExt / xWinExt) + xViewOrg yViewport = (yWindow - yWinOrg) x (yViewExt / yWinExt) + yViewOrg,

În modul MM_LOENGLISH, de exemplu, Windows calculează lungimile astfel încât să fie respectate următoarele relații:

xViewExt / xWinExt = numărul de pixeli în direcția orizontală de 0.01 inci -yViewExt / yWinExt = numărul de pixeli în direcția verticală de 0.01 inci, luați cu semnul minus

Pentru multe dispozitive de afișare (cum ar fi VGA), raportul de compresie va fi mai mic de 1. Deoarece Windows funcționează numai cu numere întregi, utilizarea unui raport de compresie este mai rațională decât utilizarea

* Unitatea de twip definită mai sus este de 1/20 dintr-un punct (care este de 1/72 de un inch) și este exact 1/1440 inch.

Modurile de afișare metrice

valorile absolute ale factorilor de scalare, pentru a reduce eroarea în conversia coordonatelor logice și fizice.

Observați semnul minus înainte de raportul dintre lungimile pentru axa verticală. Acest minus modifică direcția axei y.

Pentru cele cinci moduri de afișare indicate, coordonatele y cresc cu

funcție DPtoLP. Presupunând că variabila pt are tipul structurii POINT, următorul cod mișcă punctul logic (0,0) în centrul zonei de lucru:

pt.x = cxClient; pt.y = cyClient; DPtoLP (hdc, pt, 1);

SetWindowOrgEx (hdc, -pt.x / 2, -pt.y / 2, NULL);

Propriile moduri de afișare

Cele două moduri de afișare rămase se numesc MM_ISOTROPIC și MM_ANISOTROPIC. Acestea sunt două moduri de afișare în care Windows vă permite să modificați lungimea zonei de ieșire și a ferestrei și, prin urmare, să schimbați factorul de scalare pe care Windows îl folosește pentru a converti coordonatele logice la cele fizice. Cuvântul izotropic înseamnă același în toate direcțiile; anisotropic - nu la fel. La fel ca în modurile metrice de afișare discutate mai devreme, MM_ISOTROPIC utilizează aceleași măsurători pe axe. Unitățile logice de măsură de-a lungul axei x au aceeași reprezentare în unitățile fizice ca unitățile logice de măsură de-a lungul axei y. Acest lucru vă ajută când trebuie să creați o imagine cu dimensiunea relativă corectă, indiferent de mărimea pixelului relativă a afișajului.







Diferența dintre modurile de afișare în modul MM_ISOTROPIC și metric este că în modul MM_ISOTROPIC puteți controla dimensiunea fizică a unei unități logice de măsură. Puteți face dimensiunea fizică a unității logice de măsură astfel încât desenele dvs. să fie întotdeauna conținute în întregime în zona de lucru a ferestrei, fie într-o vedere redusă sau mărită. De exemplu, programul de apelare ANACLOCK (ceas analogic) din capitolul 7 este un exemplu de imagine izotropă. Ceasul are întotdeauna o formă rotundă. Imediat ce redimensionați fereastra, dimensiunea imaginii se modifică în consecință. Un program pentru Windows poate gestiona redimensionarea imaginii prin schimbarea corespunzătoare a lungimilor ferestrei și a zonei de ieșire. În acest caz, programul poate utiliza aceleași unități logice de măsură atunci când apelează funcțiile de desen, indiferent de mărimea ferestrei.

Modurile de afișare metrice

Uneori, modul de afișare MM_TEXT și alte moduri metrice sunt numite moduri de afișare complet obligatorii. Aceasta înseamnă că nu aveți capacitatea de a modifica lungimea ferestrei și a zonei de ieșire și, prin urmare, scara conversiei coordonatelor logice la coordonatele dispozitivului. MM_ISOTROPIC este un mod de afișare parțial obligatoriu. Windows vă permite să modificați întinderea ferestrei și a zonei de ieșire, dar sistemul le convertește astfel încât coordonatele logice x și y să aibă aceeași noțiune de unități fizice. Modul de afișare MM_ANISPTROPIC nu este obligatoriu. Puteți schimba lungimea ferestrei și a zonei de ieșire. Sistemul nu convertește aceste valori.

Modul de afișare MM_ISOTROPIC

Modul de afișare MM_ISOTROPIC este ideal pentru utilizarea axelor de coordonate alese de utilizator, menținând egalitatea unităților logice de măsură pe ambele axe. Dreptunghiurile cu înălțimea și lățimea logică egală sunt afișate ca pătrate, elipsele cu înălțimea logică egală și lățimea sunt afișate ca cercuri.

Când setați pentru prima dată modul de afișare MM_ISOTROPIC, Windows utilizează aceleași dimensiuni ale ferestrelor și zone de ieșire ca în modul MM_LOMETRIC. (Cu toate acestea, fii atent!) Diferența este că acum puteți modifica lungimea în funcție de preferințele dumneavoastră folosind SetWindowExtEx și funcția SetViewportExtEx. Apoi Windows le va schimba astfel încât coordonatele logice pe ambele axe să aibă aceeași reprezentare în coordonatele fizice.

Cel mai adesea, veți utiliza parametrii funcției SetWindowExtEx ca dimensiuni logice dorite ale ferestrei logice, iar parametrii funcției SetViewportExtEx sunt înălțimea și lățimea curente a zonei de lucru. Când Windows convertește aceste lungimi, ea caută să alinieze fereastra logică cu aria de ieșire fizică, ceea ce poate duce la o parte a zonei de ieșire aflându-se în afara ferestrei logice. Trebuie să apelați funcția SetWindowExtEx înainte de a apela funcția SetViewportExtEx pentru a face ca spațiul de lucru să fie cât mai eficient posibil.

De exemplu, să presupunem că doriți să aveți convențional sistem de coordonate cu real-un cadran, în cazul în care punctul (0, 0) - colțul din stânga jos a spațiului de lucru, și lățimea și înălțimea schimbarea în intervalul de la 0 la 32767. Veți dori, de asemenea, unitatea de-a lungul axelor x și Y a avut aceeași reprezentare fizică. Pentru a face acest lucru, procedați în felul următor:

SetWindowExtEx (hdc, 32767, 32767, NULL);

SetViewportExtEx (hdc, cxClient, -cyClient, NULL);

SetViewportOrgEx (hdc, 0, cyClient, NULL);

Dacă obțineți apoi lungimile ferestrei și zona de ieșire utilizând GetWindowExtEx și GetViewportExtEx. atunci acestea nu vor fi egale cu valorile pe care le specificați. Windows convertește lungimile pe baza raportului de aspect al dispozitivului de afișare, astfel încât unitățile logice de măsurare de pe ambele axe să aibă aceleași dimensiuni fizice.

Dacă lățimea zonei de lucru este mai mare decât înălțimea (în

În acest cod, lungimea zonei de ieșire este egală cu dimensiunea întregului ecran în pixeli. Lungimea ferestrei trebuie setată la dimensiunile întregului ecran în unități de 1/16 inch. Folosind indexurile HORZSIZE și VERTSIZE în funcția GetDeviceCaps. dimensiunile ecranului sunt exprimate în milimetri. Dacă am lucrat cu numere în virgulă mobilă, am putea converti milimetri la inch prin împărțirea de 25,4 inci și apoi conversia în unități egale cu 1/16 inci prin înmulțirea rezultatului împărțirii cu 16. Dar, din moment ce lucrăm cu numere întregi , trebuie să înmulțim milimetri cu 160 și să împărțim cu 254.

Pentru majoritatea dispozitivelor de ieșire, acest cod face o unitate logică de măsură mult mai mare decât unitatea fizică de măsură. Orice le transmiteți pe dispozitiv va avea coordonate fizice definite la 1/16 inch. Nu puteți desena două linii orizontale separate de 1/32 de centimetru, deoarece acestea ar necesita specificarea coordonatelor logice fracționate.

MM_ANISOTROPIC: întinderea imaginii

Când setați dimensiunea zonei de ieșire și fereastra în modul de afișare MM_ISOTROPIC, Windows convertește aceste valori astfel încât unitățile logice de pe ambele axe să aibă aceeași expresie în unitățile fizice. În modul de afișare MM_ANISOTROPIC, Windows nu efectuează această conversie. Aceasta înseamnă că modul MM_ANISOTROPIC nu creează neapărat raportul de aspect corect.

Pe de o parte, puteți utiliza modul MM_ANISOTROPIC în acele cazuri în care există coordonate arbitrare ale spațiului de lucru, precum și în modul MM_ISOTROPIC. Codul de mai jos stabilește punctul (0, 0) în colțul din stânga jos al zonei de lucru și cu un interval de x și y de la 0 la 32767:

SetWindowExtEx (hdc, 32767, 32767, NULL);

SetViewportExtEx (hdc, cxClient, -cyClient, NULL);

SetViewportOrgEx (hdc, 0, cyClient, NULL);

Pentru a continua descărcarea, trebuie să colectați imaginea:







Articole similare

Trimiteți-le prietenilor: