GDI grafikus Delphi

Zsargon GDI.

GDI jelentése Graphics Device Interface, és egy olyan felület, amely a Windows használ rajz 2D grafika. Továbbá, ez a leglassabb módja a grafikus megjelenítésre a meglévő, de a legkönnyebb megérteni az alapokat. Így indul el, beszéljünk az alapvető fogalmakat és kifejezéseket a GDI.

Kezdjük azzal, hogy a GDI általában nem használják, hogy hozzon létre egy hűvös kép hatását, ez a DirectX, OpenGL, vagy bármilyen grafikus könyvtár (például: DelphiX, FastLib, DIBUltra, Graphics32.). Ahhoz azonban, hogy az egyszerű hatás minimális erőfeszítéssel GDI elég baj.

A GDI szorosan kapcsolódik egy másik betűszó - DC ( "Device Context" - egy eszközt az összefüggésben). Ez az, amit rajzolni, és a Delphi készülék összefüggésben kerül bemutatásra, mint TCanvas. Az ötlet az eszköz összefüggésben lényeges, hogy ez egy univerzális kimeneti eszköz, így használhatja ugyanazt a funkciót mindkét képernyő és nyomtató.

A grafikus funkciók Delphi épül szabványos GDI Windows-funkciókat. Később fogunk beszélni ezeket a funkciókat.

És most van itt az ideje, hogy folytassa a figyelmet arról, hogy az GDI. Az alábbi táblázat néhány fontosabb osztályok:

Régen felhívni egyszerű vonalak. Jellemzően használt LineTo funkció vagy a rajz keretek bizonyos alakzatok (mint például a téglalap funkció).

Brush feltöltésére használható területének egy bizonyos színt. Ezt alkalmazzák a téglalap funkciók FillRect vagy FloodFill.

Arra használják, hogy adja meg a betűtípus, amelyben a szöveg fog készíteni. Megadhatja a betűtípus neve, mérete, stb

Ez lehetővé teszi, hogy meghatározza a régió (zárt térben). A régió lehet egy kör, négyzet, vagy tetszőleges alakú. Ez lehetővé teszi, hogy nem ugyanaz a lyuk a számok.

Azonban itt az ideje, hogy a szavakat a cselekvésre, nevezetesen azt, hogy elkezd vonalakat és alakzatokat.

vonalakat

Először világosan meg kell érteni, hogy a koordináta (0,0) a bal felső sarokban. Azaz, az értékek, az y tengelyen növekszik lefelé a képernyőn. Ennek megfelelően a koordináta (0, 50) azt jelenti, hogy csak visszavonult 50 pixeleket a képernyő felső részén.

A legfontosabb dolog az, hogy tudja, mikor vonalakat és alakzatokat, ez a különbség a tollat ​​(Pen) és ecset (Brush). Ez nagyon egyszerű: a tollat ​​(Pen) használnak rajz vonalak, keretek, és kefével (ecset), hogy kitöltse a formák.

Az alábbiakban két funkciót, amelyek a vonalakat és mindkettő a TCanvas:

Mozog a kezdőpont a vonalas rajz a megadott x és y koordinátákat

Vonalat rajzol az aktuális pozíció (lásd. MoveTo) az említett koordinátái x és y.

A hatás a mozgó a kiindulási pont a rajz egy vonal, valamint elért telepítésével svostva PenPos a vásznon. például, "Canvas.PenPos.x: = 20;", "Canvas.PenPos.y: = 50", vagy "Canvas.PenPos: = Point (20,50);".

Alapértelmezésben a kezdőpont a rajz van állítva (0,0), azaz, ha csak hívni „Canvas.LineTo (100100)” akkor vonalat rajzol a (0,0) pont egy pont (100, 100). rajzolás megkezdéséhez pont automatikusan átkerül a (100, 100), vagyis ha fut a parancs: "Canvas.LineTo (200, 100);" A következő sorban kerülnek ki a pontot (100, 100) (200, 100). Ezért, ha azt akarjuk, hogy rajzoljon egy vonalat nesoedinonnye egymással, meg kell használni az eljárás MoveTo.

A húzott az aktuális toll LineTo használja a vásznon (TPEN típus). A fő tulajdonságai a toll, a szélessége - „Canvas.Pen.Width: = 4;” (Amellyel megadhat egy másik vonal szélesség), és a színes „Canvas.Pen.Color: = clLime;”.

Nézzünk egy egyszerű példát a véletlen rajz színes vonalak:

DrawLines eljárást nevezik egy felvezető OnClick gombra. A sorok száma van beállítva NUM_LINES állandó. Mellesleg, RGB funkció a színét minden sorában három fő részből áll: vörös, zöld és kék (az értékek 0 és 255), és visszaadja nekünk a szín formájában TColor. Körülbelül színek beszélni egy kicsit később, de itt van, amit egy festett táj:

Most, hogy a vonalakat húzunk, próbálja mozgatni egy kicsit alakja. Ha áthelyezi az alak a képernyőn, akkor látni fogja, hogy a vonalak részben törlik. Ez nem hiba, és megoldani ezt a problémát nagyon egyszerű. De nem most ;-). Először is, nézzük meg, hogyan kell felhívni a különböző alakzatokat.

alakzatrajzoló

Felhívni a formák TCanvas az alábbi funkciókat biztosítja:

Döntetlen string vászonra, mivel a koordináták (x, y) - a háttér színe a szöveg tele van az aktuális ecsettel.

Canvas.TextOut (10, 10, 'Néhány szöveg');

By the way, a funkció lehetővé teszi, hogy dolgozzon szöveg nem tölti ki a hátteret. Ha meg kell változtatni a betűtípust használt TextOut, meg kell változtatni a betűtípus tulajdon a vászon (ez a tulajdonság típusú Tfont-ot) - például „Canvas.Font.Name: =»Verdana«;”, „Canvas.Font.Size: = 24;” vagy "Canvas.Font.Color: = clRed;".

Röviden szeretném felhívni a figyelmet, hogy egy szép hasznos osztálya a TRect, amely képes tárolni értékű bal, jobb, felső és alsó (mellesleg, a Windows API egy RECT). Aztán enni ahhoz, hogy adja meg a bal és felső koordináta és a szélessége és magassága a területet, de TRect automatikusan kitölti a formát (bal, felső, bal, szélesség, magasság, és a magasság). Még van egy másik funkció téglalap (), amely nem ugyanaz a dolog, de a koordinátákat, hogy közvetlenül állítható, mint a bal, jobb, felső és alsó. Nos, ha szükséges, akkor az API SetRect funkciót.

Az alábbiakban egy példa, amely felhívja a véletlenszerűen különböző számokat:

Mint azt már észre, néhány számadat keret színe eltér a szín, amely megtöltötte a szám. Ez pontosan az a lényeg, hogy én a fent említett. Brush töltjük tárgyak és toll keretezés. Ha a színe az ecset (kefe) véletlenszerűen változik, a színe a toll (pen) állandó marad. Emiatt, és kiderül, ezt a képet.

ablak Újrarajzolás

Most nézzük megérteni, hogy miért az első példában törlődnek mozgó formában a képernyőn. Nevezetesen azt kell tisztázni a különbség a „rajz” és a „dolgozza át”.

Újrarajzoláskor némileg eltér a „rajz” a koncepciót. Amikor az ablak meg kell festeni, a Windows küld egy bizonyos üzenetet. Ez az üzenet érkezik „OnPaint” eseménykezelő. Bármilyen kód kerül a OnPaint felvezető kell hívni az űrlap frissíteni kell.

Például, tegyük a következő kódot a projektben:

Ha fel a gombot, hogy a forma és okát DrawSomeText felvezető OnClick gombot, akkor a probléma az eltűnését a szöveg lesz, amikor a mozgó formában. Azonban, ha az oka DrawSomeText a OnPaint felvezető alakú, akkor a szöveg a helyén marad véglegesen.

-Leírások, illetve használja ugyanazt API függvények

Így megtudtuk, vonalakat, különböző alakzatokban megtanulták, hogy ezt, hogy a teremtés nem törlődik, ha mozog a forma, és tettünk mindez segítségével szabványos funkciók VCL (például Canvas.TextOut stb.) Azonban mi van, ha nem akarja használni a VCL grafikus funkciókat, amelyek egyszerűen épül hasonló funkciókat a Windows API-t? Kérlek! Senki megtiltja nekünk, hogy nem használja az API funkciókat közvetlenül! De várjunk csak, mindannyian igényel némi HDC! Mi a HDC?

Szinte mindent a Windows használ „leíró” (fogantyú). A fogantyú egy azonosítására szolgáló módszer egy tárgy a rendszer. Minden ablaknak saját fogantyú, az egyes gombok is megvannak a maga kezelni, stb Ezért minden a mi létesítmények van egy fogantyú, mint a tulajdon - például „MyForm.Canvas.Handle”.

HDC ilyen típusú leíró (fogantyú) Context eszközök (Device Context). Már az elején mondtam, hogy a TCanvas tartalmazza a legtöbb funkció a DC. Ezért könnyen helyettesítheti a vásznon ingatlan Handle, ahol szükség van rá.

A szórakozás, akkor nézd meg egy táblázat, amely példákat mutat a hívások egyes funkcióinak a VCL és társaik a Windows API-t.

Ön is használja különböző címkéket készít különböző helyeken. Például, akkor használja a „SomeBmp.Canvas.Handle” Rajz a kép (bitmap) vagy a „Form1.Canvas.Handle”, hogy felhívja a formában.

Az API verziója TextOut funkció át kell menni egy sor kitöltött nulla. Ez azt jelenti, hogy ahelyett, hogy átmenjen egy string egy funkció közvetlenül át kell adnia, mint egy PChar. Csak ne felejtsük el, hogy adja át a függvény karakterlánc hosszát. Ehhez használhatja a hossza.

Nos, akkor már akarta tenni az alakja néhány szép képet.

Mi Bitmap (Bitmap)?

Vonalakat, akkor biztosan jó, de előbb-utóbb meg kell felhívni a reálisabb kartniku az alkalmazásban. Ezért meg kell tanulni együtt dolgozni raszteres képek, vagy ahogy ismert a programozók - bitmap.

Bitmap, egy grafikus objektum tartalmaz egy fejlécet a szükséges információkat a képet (például magasság, szélesség, szín, stb), sőt, maga a kép (egy nagy tömb, amely a színét minden pont). A Delphi erre a célra már biztosított TBitmap osztályban.

Bitképek levonhatjuk nemcsak formájában, hanem az egész képernyőt. Talán ez tűnhet egy kicsit furcsa, de néha hasznos lehet, különösen, ha létrehoz egy képernyővédőt. Először azonban azt kell kezelni, hogyan kell dolgozni bitmap. Íme egy példa:

Ez a funkció megpróbálja betölteni és a kijelző kép (név Fájlnév, pl „myBitmap.bmp”) kiindulva a pont (x, y).

Azt kell mondanom, hogy ez a funkció nagyon hatékony. Ez létrehozza és elpusztítja a bitmap amikor hívott, valamint minden alkalommal ellenőrzi meglétét a fájlt. Sokkal jobb, hogy állapítsa meg a TBitmap objektum részeként forma létrehozása és feltölteni egy képet a FormCreate, és engedje el a FormDestroy.

rajz funkciók GDI

TCanvas számos hasznos funkcióval, amely a munka típusú TGraphic. TGraphic típus az alap osztály a grafikus objektumok Delphi, mint például bittérképek (TBitmap), ikonok (Ticon), metafájlokat (TMetafile) és JPEG-és (TJPEGImage). Ők mind ugyanazt a funkciók, amelyek a táblázatban:

Mindezen funkciók TCanvas módszerekkel.