Pascal I.      Pascal II.      Delphi       Linkek     
Pascal II.
01. Eljárások, függv...
01. Gyakorló feladatok
02. Felsorolt típus, ...
02. Gyakorló feladatok
03. Állományok kezelése
03. Gyakorló feladatok
04. Unitok, CRT unit
04. Gyakorló feladatok
05. DOS unit, rendezé...
05. Gyakorló feladatok
06. Rekurzió, quicksort
06. Gyakorló feladatok
07. Backtracking
07. Gyakorló feladatok
08. GRAPH unit
08. Gyakorló feladatok
09. Kép mozgatása
09. Gyakorló feladatok
10. Winmouse unit
10. Gyakorló feladatok
11. Dinamikus adatsze...
11. Gyakorló feladatok
12. Dinamikus adatsze...
12. Gyakorló feladatok
13. Dinamikus adatsze...
13. Gyakorló feladatok
Programozás 2 (Pascal)


     8 Graph unit
   

  • grafikus ablak, wincrt unit

  • a graph unit eljárásai és függvényei

  • sin(x) függvény kirajzolása

        
     8.1 Grafikus ablak, wincrt unit

     Eddig mindig csak szöveges módban dolgoztunk, melynek felbontása 80x25 karakter. Ahhoz, hogy tudjunk rajzolni is, mindenekelőtt inicializálnunk kell a grafikus képernyőt (módot). Windows alatt futó FreePascal-ban a grafika inicializálása után megjelnik egy új ablak, melybe rajzolhatunk. A grafika inicializálására szolgáló programunk a következőképpen néz ki:

program Pelda27;
uses graph, wincrt;
var gd,gm: integer;
begin
 {grafika inicializalasa}
 gd := d4bit;
 gm := m640x480;
 initgraph(gd,gm,'');
 {ha hiba tortent, akkor a program leallitasa}
 if graphresult<>grok then
   begin
   writeln('Hiba a grafika inicializalasanal.');
   halt;   end;
 {rajzolas}
 

  { ... }
   
 {grafikus mod bezarasa}
 readkey;
 closegraph;
end.

     Használnunk kell tehát a graph unitot (uses graph), melyben az összes grafikával kapcsolatos parancs megtalálható. A grafika inicializálásához szükségünk lesz két egész szám típusú változóra: gd és gm. Az egyikkel színmélységet (d4bit) a másikkal a grafikus felbontást (m640x480) adjuk meg.

     A grafikát az initgraph(gd,gm,''); paranccsal inicializáljuk. Ez után a parancs után, ha sikerült, megjelenik egy grafikus ablak. Az initgraph harmadik paramétereként megadhatjuk, hol található a grafikus driver (kiretjesztése bgi), ezt azonban csak akkor szükséges megadnunk ha a Borland Pascal-ét vagy egy sajátot használunk.

     Azt, hogy sikerült-e inicializálni a grafikát, a graphresult változó segítségével tudjuk leellenőrizni.

     A rajzolás után ne feledkezzünk meg a grafikus mód bezárásával (grafikus ablak bezárásával) visszatérni a szöveges módba. Erre szolgál a closegraph parancs.

     A programban használtuk még a wincrt unitot is. Ez a unit ugyanolyan nevű parancsokat tartalmaz, mint a crt unit parancsai, a különbség az, hogy a wincrt unitban található parancsok a grafikus ablakra vonatkoznak. A fenti példában a readkey utasítás végett volt rá szükségünk. Ez a parancs vár egy billentyű megnyomására a grafikus ablakban (ha a crt unitot használtuk volna, akkor a grafikus ablak mögött levő szöveges ablakban várna a billentyű megnyomására).

     A wincrt és a crt unitokat használhatjuk egy programon belül is. Ekkor ha pl. azt szeretnénk, hogy a programunk a szöveges módban levő ablakban várjon a billentyű megnyomására, akkor crt.readkey formában, ha a grafikus ablakban várja a billentyűleütést, akkor pedig wincrt.readkey forbában kellene használnunk.

          
  
   8.2 A graph unit eljárásai és f
üggvényei

     A graph unitban található néhány fontosabb parancs:

initgraph(gd,gm,path) - grafika inicializálására szolgál

closegraph - grafikus mód bezárása
    
setcolor(szin) - segítségével beállíthatju a toll (vonal) színét. Színként megadhatunk 0 és 15 közötti számot vagy a szín angol nevét (pl. red, blue, green, yellow, white, black).

setbkcolor(szin) - a háttérszín beállítására szolgál értékei hasonlóak lehetnek, mint a setcolor parancsnál.

setfillstyle(stilus,szin) - segítségével a kitöltés színét és stílusát adhatjuk meg. A színt hasonlóan adhatjuk meg, mint a setcolor parancsnál, stílusként pedig megadhatjuk a következő konstansok egyikét:

EmptyFill
SolidFill
LineFill
ltSlashFill
SlashFill
BkSlashFill
LtBkSlashFill
HatchFill Fills
XHatchFill Fills
InterLeaveFill
WideDotFill
CloseDotFill

SetLineStyle (VonalStilus,Minta,Vastagsag) - ezzel a paranccsal beállíthatjuk, hogy milyen vonaltípussal szeretnénk rajzolni. A vonalstilus lehetséges értékei:

Solidln = 0
Dottedln = 1
Centerln = 2
Dashedln = 3 
UserBitln = 4

A mintának csak a UserBitln esetében van értelme, ekkor megadhatjuk a vonal mintáját bitek segítségével. A többi esetben ez a paraméter nincs figyelembe véve.

A vonalvastagság az alábbi értékek egyike lehet:

NormWidth = 1
ThickWidth = 3

settextjustify(horizontalis,vertikalis) - segítségével megadhatjuk, hogy a szöveg kiírásánál a koordináták a szöveg melyik részére vonatkozzanak. Alapbeállításként ez a szöveg bal felső sarka. Az első paraméter lehetséges értékei:

LeftText = 0
CenterText = 1
RightText = 2

     a második paraméter értékei lehetnek:

BottomText = 0
CenterText = 1
TopText = 2

getcolor - segítségével megállapíthatjuk, milyen az éppen beállított szín.

getbkcolor - megadja, milyen az éppen beállított háttérszín.

getpixel(x,y) - megadja, milyen az X, Y koordinátájú pont színe.

     A grafikus módban alakzatok rajzolására szolgáló parancsok:

line(x1,y1,x2,y2) - vonal [x1,y1] ponttól [x2,y2] pontig.
 
lineto(x,y) - vonalat húz az előző ponttól (a toll helyétől) az [x,y] koordinátájú pontig. 
 
linerel(x,y) - vonalat húz az előző ponttól (a toll helyétől) egy olyan pontig, amely x-el jobbra és y-nal lejjebb van.
  
moveto(x,y) - a tollat átteszi (vonal húzása nélkül) az [x,y] koordinátájú pontra.
  
moverel(x,y) - a tollat átteszi (vonal húzása nélkül) egy olyan pontra, amely az előzőtől x-el jobbra és y-nal lejjebb van.
  
circle(x,y,r) - [x,y] középpontú r sugarú kör rajzolása.
  
rectangle(x1,y1,x2,y2) - téglalap rajzolása [x1,y1] ponttól [x2,y2] pontig.
  

arc(x,y,szogkezd,szogvege,sugar) - körív rajzolására szolgáló parancs.
  

ellipse(x,y,szogkezd,szogvege,xfeltengely,yfeltengely) - ellipszis vagy ellipszis ívének rajzolására szolgáló parancs.

outtext(szoveg) - szöveg kiírása a toll koordinátáira.

outtextxy(x,y,szoveg) - szöveg kiírása a megadott koordinátákra.

putpixel(x,y,szin) - az [x,y] koordinátákra egy pont kirajzolása a megadott színnel.

     Kitöltött alakzatok rajzolására szolgáló parancsok:

bar(x1,y1,x2,y2) - kitöltött téglalap.
 
fillellipse(x,y,xfeltengely,yfeltengely) - kitöltött ellipszis.
  
floodfill(x,y,keretszin)
- festték öntése az [x,y] koordinátájú pontra. A festék addig fog folyni minden irányba ettől a ponttól, amíg nem ér el keretszín színű pontig.

cleardevice - grafikus képernyő letörlése.

imagesize(x1,y1,x2,y2) - segítségével megállapíthatjuk a megadott koordinátájú kép méretét. Erre például akkor lehet szükségünk, ha a memóriában le szeretnénk foglalni egy ekkora területet és oda kimásolni a képet.

getimage(x1,y1,x2,y2,bitmap) - kép másolása a grafikus képernyőről a memóriába.

putimage(x1,y1,bitmap,hogyan) - kép kirajzolása az X, Y koordinátákra a memóriából. A hogyan paraméter megadja, miként szeretnénk a képet kirajzolni. Ennek lehetséges értékei:

CopyPut
XORPut
ORPut
AndPut
NotPut
    

     8.3 Sin(x) függvény kirajzolása

     Az alábbi példa szemlélteti, hogyan rajzolhatjunk ki a képernyőre a sin függvény grafikonját:

program Pelda28;
uses graph, wincrt;
var gd,gm: integer;
    i:integer;

function IntToStr(szam:integer):string;
var szoveg:string;
begin
 str(szam,szoveg);
 IntToStr:=szoveg;
end;

begin
 {grafika inicializalasa}
 gd := d4bit;
 gm := m640x480;
 initgraph(gd,gm,'');
 {ha hiba tortent, akkor a program leallitasa}
 if graphresult<>grok then
   begin

   writeln('Hiba a grafika inicializalasanal.');
   halt;
   end;
 {tengelyek kirajzolasa}
 setcolor(blue);
 line(100,50,100,350);
 line(100,200,500,200);
 settextjustify(centertext,toptext);
 for i:=1 to 4 do
   begin

   line(90*i+100,198,90*i+100,202);
   outtextxy(90*i+100,205,IntToStr(i*90));
   end;
 settextjustify(righttext,centertext);
 for i:=-1 to 1 do
   begin

   line(98,90*i+200,102,90*i+200);
   outtextxy(95,90*i+200,IntToStr(-i))
   end;
 {sin(x) kirajzolasa}
 setcolor(yellow);
 moveto(100,200);
 for i:=0 to 360 do
   lineto(i+100,trunc(sin(i*PI/180)*90+200));

 {grafikus mod bezarasa}
 readkey;
 closegraph;
end.

Végezetül gyakorlásképpen érdemes még letöltenünk és átnéznünk egy analóg óra kirajzolását és animálását megvalósító programot. Az óra mutatóit úgy mozgatjuk a programban, hogy azt mindig fekete színnel átrajzoljuk, majd kirajzoljuk az új helyre:

          ora.pas

   

(C) 2004-2013, PaedDr. Végh Ladislav, Komárno, Szlovákia