|
|
Grafika a Delphi-ben
Canvas objektum 1. rész
|
|
Példaprogram letöltése
5937 bájt
|
Új sorozatunkban a Windows grafikával foglalkozunk, kezdve a TCanvas teljes körű ismertetésétől a GDI (Graphic Device Interface) függvényekig. Az így szerzett ismereteket felhasználhatjuk a saját magunk által készített vizuális komponensek, vagy képfeldolgozó programok tervezésénél és kivitelezésénél is.
A TCanvas nem más, mint egy „vászon”, amire tetszőleges képet rajzolhatunk. Amikor például egy vizuális komponenst készítünk, akkor annak képét egy TCanvas objektumban készítjük el. A standard Windows komponenseknek (pl. TEdit) nincs Canvas-uk, ezek kirajzolásáról a Windows gondoskodik.
A rajzoláshoz magában a TCanvas osztályban találhatunk rengeteg eljárást, függvényt, melyekkel a következő lehetőségeink vannak:
- vonalakból, körívekből és görbékből álló alakzatokat hozhatunk létre;
- beállíthatjuk a vonalvastagságot, színt, stílust, az alakzat kitöltéséhez használt mintát;
- bitképeket jeleníthetünk meg a képen, különböző módokon;
- szövegeket jeleníthetünk meg különböző betűtípussal.
Vonal rajzolásához a LineTo eljárást használhatjuk. Ennek csupán két paramétere van: a rajzolandó vonal végpontjának koordinátái. Felmerülhet a kérdés, hogy akkor hogyan adjuk meg a vonal kezdőpontját? A vonalat a LineTo eljárás mindig az aktuális rajzolási pozíciótól húzza. Ezt a pozíciót a MoveTo eljárással, vagy a PenPos property-n keresztül tudjuk beállítani. A MoveTo eljárás egy koordinátát vér, míg a PenPos egy TPoint típusú értéket. A rajzolási pozíció mindig az utoljára megrajzolt alakzat végpontja lesz. Ha például vonalat húzunk, akkor az új pozíció a vonal végpontjában lesz.
MoveTo(20, 20);
LineTo(80, 20);
LineTo(20, 20);
A TPoint típust több alakzat megrajzolásához is használjuk majd. Erről annyit érdemes tudni, hogy egy koordinátapárt tárolhatunk benne, vagyis van egy X és egy Y mezője.
Alapesetben a bal felső pixel koordinátája (0,0), ezt viszont megváltoztathatjuk a CanvasOrientation property módosításával. Ennek a propertynek két értéke lehet:
- coLeftToRight: a (0,0) koordináta a bal-felső sarokban van.
- coRightToLeft: a (0,0) koordináta a jobb-felső sarokban van.
A példában egy olyan programot készítettünk, amivel egy TPaintBox komponensre vonalakat rajzolhatunk az egérrel. A TPaintBox komponens tulajdonképpen csak egy Canvas-t jelenít meg, amire kedvünk szerint rajzolhatunk. Azt azonban tudnunk kell, hogy ha a komponens területét ideiglenesen eltakarja valami, mondjuk egy másik Form, akkor az eltakart területen lévő rajz törlődik. Ez igaz abban az esetben is, ha a Form Canvas-ára rajzolunk. Ha nem szeretnénk, hogy a kép, amit rajzolunk megsérüljön ilyen esetekben, akkor azt rajzoljuk meg egy futásidőben létrehozott TCanvas objektumban, majd másoljuk át a komponens Canvas-ára, vagy a Form OnPaint eseményénél mindig frissítsük a képet.
A példaprogramban tehát vonalakat rajzolunk az egér segítségével. Az egérgomb lenyomásakor kijelöljük a vonal kezdőpontját, az egérgomb felengedésekor pedig a végpontját. A kezdőpont kijelölése után elmozgatva az egeret láthatjuk, hogy a vonalat mindig megrajzoljuk az aktuális egérpozíciónak megfelelően, az mégsem „marad” ott, és nem törli a már megrajzolt vonalakat sem. Ennek oka a Pen property Mode tulajdonságánál keresendő.Eza property az új és a már meglévő színek között egy logikai műveletet végez, és az eredményt jeleníti meg. Amikor ideiglenesen rajzoljuk meg a vonalat, akkor ezt az értékét pmNotXor-ra állítjuk. Az XOR műveletről tudhatjuk, hogy kétszer végrehajtva a műveletet ugyanazon értékekkel, a kiinduló értékekhez jutunk. Tehát ha rajzolunk egy vonalat pmXor vagy pmNotXor módban, akkor az megjelenik a képen, de ha ugyanezt a vonalat újra megrajzoljuk saját magára, akkor eltűnik. Ha ilyen módon rajzoljuk meg a vonalat, akkor viszont számoljunk azzal, hogy a vonal színe nem, vagy nem teljesen egyezik meg a Pen.Color property-ben megadott színnel.
A TrackBar komponenssel a vonalvastagságot is tudjuk állítani. A vonalvastagságot szintén a Pen property-n keresztül adhatjuk meg a Width mezőben.
PaintBox1.Canvas.Pen.Width := 2;
A Pen property-vel és azzal együtt a TPen osztállyal a cikksorozat egy későbbi részében részletesebben is foglalkozunk.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 473. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|