Anton Grigoriev - ceea ce nu este scris în cărțile despre delfii - pagina 22

Utilizarea de perii, stilouri și fonturile în GDI este fundamental diferit de modul în care se face în VCL. Clasa TCanvas are proprietățile Pen. Perie. și Font. modificând proprietățile care conduc la selectarea unui stilou, perie și font. În GDI, aceste obiecte sunt independente, trebuie să fie create, să aibă propriul descriptor, să fie "selectate" în contextul dispozitivului dorit utilizând funcția SelectObject și distruse după utilizare. Și puteți șterge numai acele obiecte care nu sunt selectate în nici un context. Există, de asemenea, câteva obiecte standard pe care nu trebuie să le creați sau să le ștergeți. Descriptorii acestora pot fi obținuți utilizând funcția GetStockObject. De exemplu, luați în considerare un fragment al programului care trasează două linii în contextul descriptorului DC: albastru și roșu (consultați listele 1.18). Acest fragment utilizează faptul că funcția SelectObject returnează un descriptor al obiectului legat de obiectul selectat, care a fost selectat mai devreme. Deci, atunci când aleg un nou stilou, se întoarce un mâner la stilou, care a fost selectat înainte.







Listing 1.18. Desen cu pene diferite folosind GDI

SelectObject (DC, CreatePen (PS_SOLID, 1, RGB (255, 0, 0)));

MoveToEx (DC, 100, 100, zero);

LineTo (DC, 200, 200);

DeleteObject (SelectObject (DC, CreatePen (PS_SOLID, 1, RGB (0, 0, 255))));

MoveToEx (DC, 200, 100, zero);

LineTo (DC, 100, 200);

Descriptorii obiectelor GDI sunt semnificative numai în cadrul procesului care le-a creat, ele nu pot fi transferate între procese. Cu toate acestea, ocazional se poate constata că o astfel de transmisie este posibilă. Sursa acestei erori este. GDI obiecta mânere care pot fi transmise între procese în versiunile mai vechi, de 16 de biți de Windows, astfel încât toate declarațiile cu privire la posibilitatea unui astfel de transfer, pur și simplu, pe baza informațiilor învechite.

Există trei formate pentru stocarea imaginilor raster în Windows: DDB, DIB și DIB-section. DDB este format dependent de dispozitiv, format definit de dispozitivul grafic la ieșirea de ieșire. DIB este o Bitmap independentă de dispozitiv, un format care este uniform pentru toate dispozitivele. Formatul DIB - este un format învechit, care nu permite utilizarea de grafice funcții GDI pentru a modifica imaginea, puteți modifica imaginea, doar o singură cale: schimbarea manual culorile pixelilor individuali. În versiunile pe 32 de biți, a apărut un alt format - secțiunea DIB. De fapt, acest lucru este același DIB, dar suplimentat de capacitatea de a beneficia de el folosind funcțiile GDI. Toate diferențele dintre aceste trei formate pot fi găsite în cartea remarcabilă [1]; ne vom limita aici la un scurt sondaj despre ei.







DIB-sectiune pot fi stocate în orice zonă de memorie, dimensiunea sa este limitată doar de dimensiunea cererii de memorie disponibile, funcțiile GDI pentru a desena pe această imagine, folosind pur algoritmi software în orice mod, fără a utiliza un accelerator hardware. Secțiunea DIB acceptă o adâncime de culoare diferită și acces direct la zona de memorie în care este stocată imaginea. Secțiunea DIB este portabilă de la un dispozitiv la altul. Fișierele BMP stochează imaginea ca DIB.

Clasa TBitmap poate stoca imaginea ca secțiune DDB sau DIB - aceasta este determinată de valoarea proprietății PixelFormat. Valoarea pfDevice înseamnă utilizarea DDB, valorile rămase fiind secțiuni DIB cu adâncimi de culoare diferite. Implicit, TBitmap creează o imagine cu formatul pfDevice. dar programatorul poate schimba formatul în orice moment. Aceasta creează o nouă imagine a formatului dorit, vechea este copiată în ea și distrusă.

Proprietatea HandleType este strâns legată de proprietatea PixelFormat. care poate lua valorile bmDIB și bmDDB. Schimbarea proprietății PixelFormat determină modificarea proprietății HandleType. și invers.

Când încărcați o imagine dintr-un fișier, o resursă sau un flux, clasa TBitmap creează de obicei o imagine în formatul secțiunii DIB care se potrivește cu sursa în funcție de adâncimea de culoare. Excepția este fișierele comprimate (formatul BMP acceptă compresia numai pentru imaginile de 16 și 256 de culori) - în acest caz, este creat DDB. Variabila globală DDBsOnly este definită în fișierul Graphics. care implicit este Fals. Dacă îi modificați valoarea la True. Imaginea încărcată va avea întotdeauna un format DDB.

Clasa TBitmap are proprietatea ScanLine. prin care puteți accesa direct spectrul de pixeli care alcătuiesc imaginea. În ajutor se scrie că această proprietate poate fi utilizată numai cu imagini DIB. Dar, de fapt, imaginile DDB permit, de asemenea, utilizarea acestei proprietăți, deși cu limitări semnificative. În cazul în care imaginea este stocată în format DDB- când accesați scanline creați din DIB-copie scanline și returnează un pointer la o serie de copii. Prin urmare, în primul rând, ScanLine funcționează cu imagini DDB foarte lent și, în al doilea rând, nu funcționează cu imaginea, ci cu copia ei, din care rezultă următoarele restricții:

1. O copie este creată în momentul contactului cu ScanLine. astfel încât modificările aduse imaginii utilizând funcțiile GDI după aceea vor fi indisponibile.

2. Fiecare apel către ScanLine creează o copie nouă a imaginii, iar cea veche este distrusă. Garantează că noua copie va fi localizată în aceeași zonă de memorie, nu, deci pointerul obținut de la accesul anterior la ScanLine. nu mai pot fi folosite.

3. Modificările aduse în matricea de pixeli afectează numai copia imaginii, însă imaginea însăși nu se modifică. Prin urmare, în cazul DDB, proprietatea ScanLine face posibilă citirea, dar nu modificarea imaginii.







Articole similare

Trimiteți-le prietenilor: