- A grafikai utasítások, típusok, a grafika használata
- Lehetséges újdonságok, szokatlan dolgok
- Eltérések Code::Blocks használata esetén
- Példaprogramok
1, A grafikai utasítások, típusok, a grafika használata
Az hogy egy alkalmazásból, ténylegesen grafikusan rajzoljunk a képernyőre különféle illesztőprogramokra, és függvénytárakra volt szükség:
- A Borland C esetében, használhattuk a beépített graphics.h függvénytárat, amelyhez a Borland készített MS-DOS alapú illesztőprogramokat is
- Windows alatt a GDI/GDI+/Direct2D eljárásokat meghívva, a gyártó által mellékelt videókártya illesztőprogramon keresztül rajzolhatunk a képernyőre
Ebben a részben mi most az elsővel fogunk foglalkozni. Ennek két oka van:
- Lényegesebben egyszerűbb megtanulni mint a Windows függvénytárak használatát
- Ha Code::Blocks-ot használunk, szintén létezik graphics.h fájl - ami a Windows-os átirata a Borland C-ben található graphics.h-nak - így azzal közel 100% kompatibilis
Ezen rész jelenleg egy kissé el van hanyagolva, és két könyvre fogok támaszkodni a leírás során - jómagam ezen könyv Turbo Pascal változatából sajátítottam el a grafika programozásá, még anno:
Az elhanyagolást azért ejtettem meg, mivel a grafikai rész számtalan utasítást tartalmaz, aminek kifejtésében elfáradnék - viszont itt pár oldalban remekül össze van foglalva - ezért csak az új dolgokhoz tennék majd a továbbiakban kiegészítést.
Az utasítások mennyisége, semmiféleképpen nem a bonyolultságból adódik, hanem azért van ilyen sok:
- hogy minél több dolgot rajzolhassunk, pl. egyenest, kört, körívet, ellipszist, ellipszisívet, körszeletet, sokszöget, téglalapot, téglatestet, ... illetve ezeket kifestve (akár mintázattal is), különféle mintázatú vonalakkal megrajzolva, különféle színekkel
- hogy a válthassunk a szöveges és grafikus mód között MS-DOS alól (initgraph, closegraph utasítás - ez Code::Blocks esetében egy kicsit máshogy fog kinézni [később])
- hogy villogásmentes animációt csinálhassunk (setvisualpage, setactivepage)
- hogy kimásolhassunk, beilleszthessünk, kivághassunk, törölhessünk képszeleteket (getimage, putimage)
- stb...
Természetesen, egy egyszerű grafikus alkalmazásban ezeknek csak a töredékét fogjuk használni.
2, Lehetséges újdonságok, szokatlan dolgok
- különféle videokártyák: ezzel nem kell vacakolni, a mai gépekben mindig VGA kompatibilis kártyák vannak, ezt kell választani, ha kell - és a 640x480 felbontású üzemmódot kell alkamazni
- far utasítás/típus/változó/...: a könyv ezzel csak azt jelöli, hogy ez az utasítás/típus/változó/stb... egy külső fájlban van, ami nem más mint a graphics.h
- cprintf/cscanf utasítás: a példákban használható helyette a printf/scanf, azokkal teljesen egyenértékű
-
clrscr utasítás: letörli a szöveges képernyőt,
ha feltétlenül fontos - használható helyette a
utasítás (stdio.h)system("@cls||clear");
- cputs/cgets utasítás: a példákban használható helyette a puts/gets, azokkal teljesen egyenértékű
- előrejelzett eljárások:
void page(int*); //előrejelzi hogy később lesz egy page nevű eljárás, ami egy int* paramétert fog bekérni
int main()
{
//habár a page eljárás, előtte még nincs kidolgozva - de meghívhatja, mivel előrejeleztük
}
void page(int *Active)
{
//itt van kidolgozva ami benne van
} -
delay utasítás: felfüggeszti a program futását, a megadott ideig (ezredmásodpercben [1000 ms = 1 s]) - Borland C esetén ehhez szükséges lehet a dos.h és a conio.h , Code::Blocks esetééln a graphics.h tartalmazza
3, Eltérések Code::Blocks használata esetén
Nincs szükség sem BGI driverekre, mivel a Windows alatt telepítjük a videokártya illesztőprogramját (pl. NVIDIA, AMD, Intel, S3) - ezért a grafikus "mód" elindítása az initwindow eljárással történik. Ez megnyit egy ablakot a képernyőn, amire rajzolhatunk (természetesen a régi initgraph, stb... megnyitás is működik - a BGI fájlok mappája pl. lehet NULL ilyenkor).
3a, A Windows alatti grafika elindítása
int initwindow(int width, int height, const char* title="Windows BGI", int left=0, int top=0, bool dbflag=false, bool closeflag=true);
Elindítja a Windows-os grafikus üzemmódot
width: az ablak szélessége - ajánlás szerint
640
height: az ablak magassága - ajánlás szerint 480
title: nem kötelező - az ablak címe, alapból Windows BGI lesz a
címe
left: nem kötelező - az ablak vízszintes elhelyezése a
képernyőn - alapból bal oldalra van elhelyezve
top: nem kötelező - az ablak függőleges elhelyezése a képernyőn
- alapból felülre oldalra van elhelyezve
dbflag: nem kötelező - ki/bekapcsolja a kettőspufferelést, ami
bekapcsolva animációk esetén csökkenti a villogást
closeflag: nem kötelező - ha false akkor a kilépés gomb le lesz
tiltva a sarokban, csak a closegraph() utasítás zárhatja be az ablakot
A függvény visszatérési értéke egy egyedi azonosító, ami az adott ablakra jellemző. A Code::Blocks lehetővé teszi, hogy egyszerre több ablakot is használjunk, és a setcurrentwindow függvénynek megadva ezt az azonosítót, lehet eldönteni hogy éppen melyikre rajzolunk.
Példa (egy vonal az ablak két sarka között):
#include <graphics.h> int main() { initwindow(640, 480); line(0, 0, getmaxx(), getmaxy()); getch(); closegraph(); return 0; } |
Példa (két ablak, két vonal):
#include <graphics.h> int main() { int hWnd1, hWnd2; hWnd1 = initwindow(640, 480, "Ablak 1"); hWnd2 = initwindow(320, 240, "Ablak 2", 200, 100); setcurrentwindow(hWnd1); line(0, 0, getmaxx(), getmaxy()); setcurrentwindow(hWnd2); line(0, 0, getmaxx(), getmaxy()); getch(); closegraph(); return 0; } |
3b, További Windows utasítások
A BGI for Windows teljes leírása itt található - itt minden utasításnak megtalálható a teljes fejléce, illetve hogy melyiket, mire, hogyan kell használni: link
Néhány klasszikus BGI utasítás értelmét vesztette, és nem csinál semmit,
viszont sok új is van - pl. egérkezelésre, nyomtatásra, kép mentésére ".bmp"
fájlba, stb. - ezek
jelöléssel vannak ellátva.
3c, Az első grafikai projekt elkészítése
Itt szintén nincs kedvem kifejteni, mivel remek leírás van fent az interneten Dr. Dudás László oldalán: link
Ahhoz hogy a leírás a saját gépünkön is működjön a Code::Blocks pendriveon is hordozható változatát kell beszerezni (lásd IDE oldal), aminek a linkje itt található meg: link
Ellenkező esetben, mind a Code::Blocks, mind a WinBGIm csomag telepítése kézzel kell történjen - ami lehetséges, de kezdőknek nem ajánlott.
4, Példaprogramok
A lefordítás során a 3c, pontban leírt módon kell projektfájlt csinálni Code::Blocks esetén, és abba csatolni a .C fájlt.
Néhány program átírását még nem végeztem el, ezek Turbo Pascal nyelven tekinthetőek meg addig is. Ezek lefordításáshoz szükséges egy MS-DOS alapú Turbo Pascal rendszer - természetesen majd át lesznek írva C/C++ nyelvre is.
A feladatok nem légbőlkapottak, a leírásuk a mellékelt könyvfejezet végén található, sokszor ábrával együtt.