grafică în IDRG delphi

Jargon GDI.

GDI standuri pentru grafica Device Interface, și este o interfață care Windows le utilizează pentru desen grafica 2D. De asemenea, aceasta este cea mai lentă mod de afișare grafică a existente, dar cel mai ușor să înțeleagă elementele de bază. Deci, pentru a începe, hai sa vorbim despre conceptele de bază și termenii din GDI.







Pentru a începe cu, GDI nu de obicei folosit pentru a crea un efecte de imagine rece, acest lucru este DirectX, OpenGL, sau orice bibliotecă de grafică (cum ar fi:. DelphiX, FastLib, DIBUltra, Graphics32). Cu toate acestea, pentru a crea efecte simple, cu un efort minim GDI este destul de rău.

Cu GDI este conectat strâns un alt acronim - DC ( "device context" - un context dispozitiv). Aceasta este ceea ce ne bazăm pe, și în Delphi context de dispozitiv este prezentat ca TCanvas. Ideea device context este faptul că acesta este un dispozitiv de ieșire universal, astfel încât să puteți utiliza aceeași funcție atât pentru ecran și imprimantă.

Toate caracteristicile grafice din Delphi este construit pe funcții standard GDI Windows. Mai târziu, vom vorbi despre aceste funcții.

Și acum este momentul de a proceda la o analiză a modului în care GDI. Tabelul de mai jos prezintă câteva clase importante:

Este folosit pentru a desena linii simple. De obicei utilizate pentru funcția LineTo sau prin tragere cadre pentru anumite forme (cum ar fi funcția de dreptunghi).

Perie folosit pentru a umple zona de o anumită culoare. Acesta este utilizat în funcțiile de dreptunghi, FillRect sau FloodFill.

Este folosit pentru a specifica fontul în care vor fi trase textul. Puteți specifica numele fontului, dimensiunea, etc.

Acesta vă permite să specificați regiunea (spațiu închis). Regiunea poate fi un cerc, pătrat, sau formă arbitrară. Acesta vă permite să faceți aceeași gaură în figuri.

Cu toate acestea, este timpul pentru a trece de la cuvinte la acțiune, și anume, pentru a începe pentru a desena linii și forme.

Desen de linii

În primul rând ar trebui să fie înțeles în mod clar că coordonatei (0,0) este colțul din stânga sus al ecranului. Adică, valorile de pe axa y crește în jos pe ecran. Prin urmare, coordonatele (0, 50) înseamnă că tocmai retras de 50 de pixeli din partea de sus a ecranului.

Cel mai important lucru este de a ști când desena linii și forme, aceasta este diferența dintre un stilou (Pen) și o perie (perie). Este foarte simplu: pen-ul (Pen) este folosit pentru liniile de desen sau de cadre, și o perie (perii) pentru a umple formele.

Mai jos sunt două funcții care sunt folosite pentru a desena linii și ambele fac parte din TCanvas:

Mută ​​punctul de pornire al desenului liniei la coordonatele x și y specificate

Trage o linie din poziția curentă (vezi. MoveTo) menționate coordonatele x și y.

Efectul se deplasează punctul de plecare al trasarea unei linii cat si realizat prin instalarea PenPos svostva în panza. de exemplu, "Canvas.PenPos.x: = 20;", "Canvas.PenPos.y: = 50", sau "Canvas.PenPos: = Punct (20,50);".

În mod implicit, punctul de pornire al desenului este setat la (0,0), care este, dacă doar te sun „Canvas.LineTo (100100);“ apoi se trage o linie de la punctul (0,0), până la un punct (100, 100). începe punctul de desen este mutat automat la (100, 100), adică, dacă rulați comanda "Canvas.LineTo (200, 100);", linia următoare va fi trasă din punctul (100, 100) până la (200, 100). Prin urmare, dacă vrem să atragă o linie nesoedinonnye unul cu celălalt, trebuie să utilizați metoda MoveTo.

Linia desenate folosind LineTo pen curent foloseste panza (tip tpen). Principalele proprietăți ale stiloului, lățimea - „Canvas.Pen.Width: = 4;“ (Cu care puteți specifica o lățime de linie diferită), și culoarea „Canvas.Pen.Color: = clLime;“.

Să ne uităm la un exemplu simplu de linii colorate tragere la sorți:

Procedura DrawLines se numește dintr-un buton de tratare a OnClick. Numărul de linii este stabilit în NUM_LINES constantă. De altfel, caracteristica RGB este culoarea fiecărei linii a trei componente principale: roșu, verde și albastru (valori de la 0 la 255), și ne returnează culoarea sub formă de TColor. Despre culori vorbesc un pic mai târziu, dar iată ce un peisaj pictat:

Acum, că liniile sunt trase, încearcă să se miște un pic de formă. Dacă mutați forma ecranului, veți vedea că liniile sunt șterse parțial. Nu este un bug, și pentru a rezolva această problemă este foarte simplu. Dar nu acum ;-). În primul rând, să vedem cum să atragă diferite forme.







desenați forme

Pentru a desena forme în TCanvas oferă următoarele funcții:

Extragerile sir dat pe panza, deoarece coordonatele (x, y) - culoarea de fond a textului este umplut cu pensula curent.

Canvas.TextOut (10, 10, 'Unele text');

Apropo, funcția vă permite să atragă text fără a umple-l cu fundalul. Dacă trebuie să schimbați fontul utilizat în TextOut, trebuie să modificați proprietatea Font a pânzei (această proprietate este de tip TFont) - de exemplu, „Canvas.Font.Name: =«Verdana»;“, „Canvas.Font.Size: = 24;“ sau "Canvas.Font.Color: = clRed;".

Pe scurt, aș dori să vă atrag atenția asupra unei clase destul de utilă a unui TRect, care este capabil de a stoca o valoare de stânga, dreapta, sus și jos (de altfel, în API-ul Windows este un RECT). Apoi mâncați suficient pentru a specifica stânga și sus de coordonate și lățimea și înălțimea zonei, dar TRect umple automat în forma (stânga, sus, stânga, lățimea, înălțimea și înălțimea). Cu toate acestea există o altă funcție Rect (), care face același lucru, dar coordonatele în ea sunt stabilite direct ca stânga, dreapta, sus și de jos. Ei bine, dacă se dorește, puteți utiliza funcția API SetRect.

Mai jos este o probă, care atrage în mod aleatoriu diferite figuri:

După cum ați observat deja, unele cifre au culoare cadru diferite de culoare care a umplut figura. Acesta este exact punctul pe care am menționat mai sus. Perie ne umple obiecte si ancadramente pene. Dacă culoarea periei (pensula) se schimbă în mod aleatoriu, culoarea stiloului (pen) rămâne constantă. Din acest motiv, și se pare că această imagine.

fereastră redesenare

Acum, trebuie să înțelegem de ce în primul exemplu, am șters atunci când se deplasează forma ecranului. Și anume, trebuie să clarificăm diferența dintre „desen“ și „redesenarea“.

Retrasarea oarecum diferit de „desenul“ a conceptului. Când fereastra trebuie revopsit, Windows trimite un anumit mesaj. Acest mesaj vine „OnPaint“ tratare a evenimentului. Orice cod care este plasat în handler OnPaint va fi numit de fiecare dată când formularul trebuie să fie actualizat.

De exemplu, plasați următorul cod în proiect:

Dacă ați pus pe buton pentru a forma și cauza handler DrawSomeText buton OnClick, atunci problema este cu dispariția textului va fi atunci când se deplasează forma. Cu toate acestea, în cazul în care cauza DrawSomeText formei de tratare a OnPaint, atunci textul va rămâne în vigoare permanent.

Descriptorii, sau de a utiliza aceleași funcții API

Așa că am învățat să traseze linii, diferite figuri au învățat să facă astfel încât creația noastră nu este ștearsă când vă deplasați forma, și am făcut toate acestea cu ajutorul unor funcții standard VCL (cum ar fi Canvas.TextOut etc.). Cu toate acestea, ce se întâmplă dacă nu doriți să utilizați funcțiile grafice VCL, care pur și simplu este construit pe funcții similare de la Windows API? Vă rog! Nimeni nu ne interzice să nu folosească funcțiile API direct! Dar stai, toate necesită unele HDC! Ce este HDC?

Aproape totul în Windows utilizează un „descriptor“ (mâner). Mânerul este o metodă de identificare a unui obiect în sistemul dumneavoastră. Fiecare fereastră are propriul mâner, fiecare buton are, de asemenea, propriul său mâner, etc. De aceea, toate facilitățile noastre au un mâner ca o proprietate - de exemplu, „MyForm.Canvas.Handle“.

HDC acest descriptor tip (mâner) dispozitive de context (dispozitiv de context). Am spus deja la început că TCanvas include cele mai multe dintre funcțiile de curent continuu. Prin urmare, putem înlocui cu ușurință mânerul de proprietate panza ori de câte ori avem nevoie de ea.

Pentru distracție, vă puteți uita la un tabel care prezintă exemple de apeluri ale unor funcții ale VCL și omologii lor din API-ul Windows.

Puteți folosi, de asemenea, tag-uri diferite pentru a trage în locuri diferite. De exemplu, puteți utiliza „SomeBmp.Canvas.Handle“ Desen imagine (bitmap) sau „Form1.Canvas.Handle“, pentru a trage pe formular.

Versiunea API a funcției TextOut este necesară pentru a trece un șir de zero, completat. Acest lucru înseamnă că, în loc să treacă un șir de caractere la o funcție în mod direct, trebuie să-l treci ca PChar. Doar nu uitați să treacă într-un șir de lungime funcție. Pentru a face acest lucru, puteți utiliza lungime.

Ei bine, ai vrut deja să pună pe forma unor imagine frumoasă.

Ce este Bitmap (Bitmap)?

Desen de linii, este cu siguranță bun, dar mai devreme sau mai târziu, va trebui să atragă un kartniku mai realist în aplicația dumneavoastră. Prin urmare, este necesar să învețe să lucreze cu imagini raster, sau așa cum sunt ele cunoscute printre programatori - bitmap-uri.

Bitmap, este un obiect grafic care conține un antet cu informațiile necesare despre imagine (cum ar fi înălțimea, lățimea, culoare, etc.) și, de fapt, imaginea în sine (o matrice mare care conține culoarea fiecărui punct). În Delphi în acest scop, este deja prevăzută clasa TBitmap.

Bitmapuri poate desena nu numai pe forma, dar, de asemenea, pe ecran. Poate că acest lucru s-ar putea părea un pic ciudat, dar uneori poate fi util, mai ales atunci când creați un economizor de ecran. Cu toate acestea, mai întâi trebuie să se ocupe de modul de a lucra cu bitmap-uri. Iată un exemplu:

Această funcție încearcă să încarce și imaginea afișată (cu numele Filename, de exemplu, „myBitmap.bmp“), pornind de la punctul (x, y).

Trebuie să spun că această caracteristică este destul de ineficient. Se creează și distruge bitmap ori de câte ori numit, precum și fiecare existența controalelor de timp a fișierului. Este mai bine să declare un obiect TBitmap, ca parte a formularului pentru a crea și de a încărca o imagine în FormCreate, și să-l elibereze în FormDestroy.

desen funcții în GDI

TCanvas are mai multe funcții utile care lucrează cu tipul de TGraphic. tip TGraphic este clasa de baza pentru obiecte grafice din Delphi, cum ar fi bitmapuri (TBitmap), icoane (Ticon), metafiles (TMetafile) și JPEG-și (TJPEGImage). Ei folosesc toate aceleași caracteristici care sunt prezentate în tabel:

Toate aceste funcții sunt metode TCanvas.