Egyszerű síkbeli grafikai alkalmazás


  1. A grafikai utasítások, típusok, a grafika használata
  2. Lehetséges újdonságok, szokatlan dolgok
  3. Eltérések Code::Blocks használata esetén
    1. A Windows alatti grafika elindítása
    2. További Windows utasítások
    3. Az első grafikai projekt elkészítése
  4. 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
      system("@cls||clear");
    utasítás (stdio.h)
  • 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 [WIN 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.

GRAFIKA1.C
GRAFIKA1.EXE
GRAFIKA2.C
GRAFIKA2.EXE
MINTA1.C
MINTA1.EXE
MINTA2.C
MINTA2.EXE
F_SZOVEG.C
F_SZOVEG.EXE
G_SZOVEG.C
G_SZOVEG.EXE
MEGHAJTO.C
MEGHAJTO.EXE
GRVALTAS.C
GRVALTAS.EXE
MOZOG.C
MOZOG.EXE
PALETTA.C
PALETTA.EXE
       
GPLD.C
GPLD.PAS
GPLD.EXE
ASPECT_P.PAS FERDEHAJ.PAS KIVAG.PAS PALETTAD.PAS
           
RAJZ1.PAS RAJZ2.PAS RAJZ3.PAS TORZIT.PAS V_SZINES.PAS V_FEKETE.PAS

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.