|
se gaseste fila cu driverul grafic.Daca pointerul *path este NULL,atunci
|
səhifə | 32/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| se gaseste fila cu driverul grafic.Daca pointerul *path este NULL,atunci
driverul grafic trebuie sa fie in directorul curent.Calea de acces este
apelata si de catre functia settextstyle() pentru a verifica filele care
contin caracterele speciale (*.CHR).
Driverul grafic se specifica prin codul sau numeric de tip int,care poate
fi: 0(DETECT=autodetectie), 1(CGA) ,2(MCGA) ,3(EGA) ,4(EGA64) ,5(EGAMONO)
6(IBM8514) ,7(HERCMONO) ,8(ATT400) ,9(VGA) ,10(PC3270)
Modul grafic(graphmode) se specifica tot prin codul numeric de tip int,
dupa cum urmeaza: CGA(0-4),MCGA(0-5),EGA(0-1),EGA64(0-1),EGAMONO(3),
HERCMONO(0),ATT400(0-5),VGA(0-2),PC3270(0),IBM8514(0-1)
Prin specificarea modului grafic se va determina paleta grafica utilizata
(dintre cele implicite),rezolutia ecranului si numarul de culori.Daca nu
stiti ce placa grafica utilizati,se recomanda sa utilizati doar varianta
de autodetectie a driverului grafic si a modului grafic.
Cele patru palete grafice implicite sunt: 0(LIGHTGREEN,LIGHTRED,YELLOW),
1(LIGHTCYAN,LIGHTMAGENTA,WHITE),2(GREEN,RED,BROWN),3(CYAN,MAGENTA,GRAY).
Rezolutia ecranului este determinata de driverul grafic si de modul grafic
selectat si poate fi intre 320x200(CGA,ATT400) si 640x480(MCGA,VGA,IBM)
sau chiar 1024x768 si 256 culori(IBM9514 mod 0).
Culorile pot fi 2(alb-negru),4(paletele implicite),16 sau chiar 256.
Rezolutia ecranului se refera la numarul total de linii si coloane,respec-
tiv la numarul total de puncte de pe ecran.Cu cat numarul total de linii
si coloane este mai mare,cu atat dimensiunea fiecarui punct va fi mai
mica,imaginile vor fi tot mai discriminative iar rezolutia se va spune ca
este mai mare.
Pentru orice valori,diferite de cele din tabele(cu exceptia DETECT),rezul-
tatul este inpredictibil.Nu incercati sa fortati drivere grafice care nu
sunt compatibile cu versiunea d-voastra de C.In C++ si mai ales in Visual
C++,functiile grafice din biblioteca API beneficiaza de toate resursele
grafice ale sistemului Windows (inclusiv numarul de culori).Nu incercati
sa fortati accesul la resurse,atunci cand nu stiti exact ce rezultat ob-
tineti,deoarece riscati sa dereglati complet sistemul de afisaj.
-231- [ graphics.h-installuserdriver() ]
EXEMPLU: #include
#include
int drv,mod;
main()
{ drv=0;
initgraph(&drv,&mod,"");
printf("driverul grafic implicit(autodetectat)");
bar3d(50,50,200,90,10,10);
sleep(3);
closegraph();
drv=1;
initgraph(&drv,&mod,"");
printf("driverul grafic color CGA ");
bar3d(50,50,200,90,10,10);
sleep(3);
}
FUNCTIA installuserdriver()
-permite adaugarea unui driver grafic in tabela interna BGI
SINTAXA GENERALA este:
int far installuserdriver(char far *name,int huge(*detect)(void));
Functia va permite sa adaugati in tabela interna a BGI,driverul grafic
oferit de catre producator impreuna cu placa grafica.Parametrul *name
specifica numele filei care contine driverul grafic iar *detect este un
pointer optional care poate autodetecta functiile ce acompaniaza noul
driver(nu accepta parametri si returneaza o valoare de tip int).
Exista doua moduri in care puteti adauga driverul producatorului.Exemplu:
daca achizitionati o plaga grafica tip Spiffy Graphics Array(SGA) impreuna
cu driverul sau de tip BGI intitulat SGA.BGI,cel mai usor mod de a utiliza
acest driver este sa apelati installuserdriver() si apoi se utilizati
valoarea returnata pentru initializarea cu initgraph().Al doilea mod po-
sibil este prin crearea unui link intre driverul grafic si o functie de
autodetectie care urmeaza sa fie inclusa in functia de initializare(adica
initgraph() apeleaza autodetectia care este linkata cu driverul grafic).
De obicei functia de autodetectie este furnizata de catre producator.
In cazul in care includeti o functie de autodetectie pentru driverul
grafic si functia initgraph() nu detecteaza placa grafica respectiva,
functia va returna codul de eroare -11(grError) si va autodetecta automat
driverul si modul grafic accesibil.Daca functia detecteaza atat driverul
cat si placa grafica,returneaza o valoare pozitiva si incarca in memorie
driverul grafic specificat(SGA.BGI in exemplul de mai sus).
In acest mod puteti instala pana la 10 drivere grafice.
Functia returneaza o valoare de tip int care este codul numeric ce trebuie
utilizat impreuna cu functia initgraph() pentru a initializa modul grafic.
Este recomandabil sa utilizati exclusiv drivere grafice produse de catre
firma care furnizeaza placa grafica,sau drivere grafice bine verificate
si functii de autodetectie standardizate.Daca scrieti singuri functiile
de autodetectie,riscati sa creati bucle infinite intre autodetectia placii
dorite de d-voastra si autodetectia impicita din functia initgraph().
Daca sunteti incepator,este mai bine sa apelati la un specialist atunci
cand instalati placi sau drivere pentru componentele hardware.
-232- [ installuserfont() si line() ]
EXEMPLU: #include
#include
int nr,err;
int mod;
char *placa="SVGA";
main()
{
nr=installuserdriver(placa,DETECT);
initgraph(&nr,&mod,"");
err=graphresult();
printf("Placa grafica instalata este: %s cod %d \n",placa,nr);
print("Numar eroare= %d \n",err);
sleep(3);
}
FUNCTIA installuserfont()
-apeleaza o fila cu caractere speciale din directorul curent
SINTAXA GENERALA este: int far installuserfont(char far *name);
Functia se utilizeaza pentru a incarca in memorie o fila din directorul
curent (nu se accepta o alta cale de acces la fila) care contine caractere
speciale utilizate pentru fonturile grafice din modul grafic.
Se pot instala astfel concomitent maximum 20 de file diferite(20 de tipuri
de fonturi grafice).
Valoarea returnata este un numar de cod de tip int care va putea fi uti-
lizat in continuare pentru apelarea fonturilor cu ajutorul functiei
settextstyle().Daca tabela interna de fonturi este plina cu fonturile
implicite (vezi functia settextstyle() ) se va returna valoarea de eroare
-11 (grError).
EXEMPLU: #include
#include
#include
int *drv,*mod,nr;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
nr=installuserfont("TRIPLEX_FONT.CHR");
settextstyle(nr,0,5);
outtextxy(100,100,"EXEMPLUL NUMARUL 1");
printf("numarul fontului utilizat este: %d \n",nr);
sleep(3);
}
FUNCTIA line()
-deseneaza o linie in culoarea,stilul si grosimea specificata
SINTAXA GENERALA este: void far line(int x1,int y1,int x2,int y2);
unde: x1,y1 si respectiv x2,y2 sunt coordonatele celor doua puncte extre-
me intre care se traseaza linia.
Functia traseaza o linie intre cele doua puncte specificate,in culoarea,
stilul si cu grosimea actuala a penitei grafice.Dupa trasarea liniei,
pozitia cursorului un este actualizata (revine la pozitia de start).
Nu returneaza nici o valoare.
-233- [ graphics.h - linerel() ]
EXEMPLUL 1: #include
#include
int *drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
setcolor(3);
line(10,10,50,50;
outtext("linia 1 ");
sleep(1);
line(100,200,400,30);
outtext("linia 2");
sleep(3);
}
Liniile trasate se pot combina pentru a realiza grafice,inagini geometrice
sau aleatorii:
EXEMPLUL 2: #include
#include
#include
int *drv,*mod,y,z;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
randomize();
for(y=1;y<10;y++)
{ for(z=1;z<50;z++)
{ setcolor(random(15));
line(random(600),random(450),random(600),random(450));};
sleep(1);
cleardevice(); }
}
FUNCTIA linerel()
-deseneaza o linie la distanta indicata si deplaseaza pozitia cursorului
SINTAXA GENERALA este: void far linerel(int dx,int dy);
Functia traseaza o linie intre pozitia actuala a cursorului si punctul
situat la distanta dx(orizontala) si dy(verticala).Pozitia cursorului este
deplasta cu dx si dy.Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
#include *drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
linerel(500,325);
sleep(2);
linerel(-400,-150);
sleep(2);
linerel(50,-75);
sleep(3); }
Functia traseaza linii,relativ la pozitia curenta a cursorului.
-234- [ lineto() si moverel() ]
FUNCTIA lineto()
-deseneaza o linie intre pozitia cursorului si punctul indicat
SINTAXA GENERALA este: void far lineto(int x,int y);
Functia traseaza o linie intre pozitia curenta a cursorului si punctul
specificat prin coordonatele x si y (coordonatele ecranului) dupa care
deplaseaza cursorul in punctul specificat (x,y).Nu returneaza valori.
EXEMPLU: #include
#include
int *drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
lineto(100,100);
sleep(1);
setcolor(3);
lineto(100,200);
lineto(400,200);
lineto(400,100);
lineto(100,100);
sleep(2);
floodfill(150,150,3);
sleep(3);
}
FUNCTIA moverel()
-deplaseaza cursorul la distanta specificata
SINTAXA GENERALA este: void far moverel(int dx,int dy);
Functia deplaseaza pozitia actuala a cursorului la distanta specificata
prin dx(orizontala) si dy(verticala).Distantele dx si dy sunt exprimate
in pixeli (coordonatele ecranului grafic).Nu returneaza nici o valoare.
EXEMPLU: #include
#include
#include
int *drv,*mod,x,y,z,nr;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
randomize();
for(nr=1;nr<20;nr++)
{ x=random(600);
y=random(400);
z=random(14)+1;
setcolor(z);
moverel(x,y);
outtext("PING PONG");
moveto(0,0);
sleep(1);
}}
In exemplul de mai sus,toate deplasarile cursorului se fac relativ la
coltul din stanga sus al ecranului,deoarece am utilizat functia moveto()
pentru a readuce cursorul la zero (pentru a nu iesi din ecran).
-235- [ moveto() si outtext() ]
FUNCTIA moveto()
-deplaseaza cursorul la pozitia indicata
SINTAXA GENERALA este: void far moveto(int x,int y);
Functia deplaseaza cursorul la punctul din regiunea activa a ecranului
specificat prin coordonatele x si y (relative la regiunea activa).
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
#include
int *drv,*mod,x,y,z,nr1,nr2;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
for(nr1=1;nr1<10;nr1++)
{ for(nr2=1;nr2<800;nr2++)
{ x=random(600);
y=random(450);
z=random(14)+1;
setcolor(z);
moveto(x,y);
outtext("*");
};
sleep(2);
cleardevice(); }}
FUNCTIA outtext()
-afiseaza un sir de caractere la pozitia actuala a cursorului
SINTAXA GENERALA este: void far outtext(char far *textstring);
Functia afiseaza sirul de caractere specificat prin textstring,la pozitia
actuala a cursorului,utilizand fonturile,directia si dimensiunile curente.
Daca textul este ordonat prin LEFT_TEXT si cu directia HORIZ_DIR,atunci
cursorul se va deplasa la capatul sirului scris.In celelalte situatii,
pozitia cursorul revine la pozitia initiala.Coordonatele penitei grafice
sunt relative la regiunea activa a ecranului (implicit la intregul ecran).
Pentru a determina daca sirul specificat incape in intregime in regiunea
activa,se pot utiliza functiile textwidth() si texthight().Daca sirul
este scris cu fonturile implicite si este mai lung decat regiunea activa
a ecranului,sirul va fi trunchiat de toate caracterele pozitionate in
afara regiunii active.Functia outtext() este destinata pentru a scrie
caractere,exclusiv in modul grafic(nu in modul text).Nu returneaza valori.
EXEMPLU: #include
#include
int *drv,*mod,x;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
for(x=1;x<16;x++)
{ moveto(20*x,10*x);
outtext("ALO !");
sleep(1);
setcolor(x); }}
-236- [ outtextxy() si pieslice() ]
FUNCTIA outtextxy()
-afiseaza un sir de caractere la pozitia specificata
SINTAXA GENERALA este:
void far outtextxy(int x,int y,char far *textstring);
Functia afiseaza sirul de caractere specificat prin textstring la poxitia
indicata prin coordonatele de ecran x si y (relative la regiunea activa a
ecranului).Textul va fi afisat utilizand fonturile,directia si dimensiuni-
le curente.Pentru a verifica daca textul incape in intregime in regiunea
activa a ecranului se pot tiliza functiile textwidth() si textheight().
Toate caracterele amplasate in afara regiunii active a ecranului vor fi
trunchiate(regiunea activa implicita este egala cu tot ecranul).Functia
este activa doar in modul grafic,nu si in modul text.Nu returneaza valori.
EXEMPLU: #include
#include
int *drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
setcolor(10);
outtextxy(100,20,"TABEL 1");
outtextxy(250,20,"TABEL 2");
outtextxy(400,20,"TABEL 3");
setcolor(3);
outtextxy(100,40,"Valoare 1");
outtextxy(250,40,"Valoare 2");
outtextxy(400,40,"Valoare 3");
sleep(3); }
FUNCTIA pieslice()
-deseneaza segmente de cerc
SINTAXA GENERALA este:
void far pieslice(int x,int y,int stangle,int endangle,int radius);
Functia deseneaza si umple cu modelul penitei un segment de cerc cu
centrul situat la coordonatele x si y,incepand de la unghiul stangle si
pana la unghiul endangle si de raza radius.Segmenul este conturat in cu-
loarea penitei si umplut cu modelul grafic al penitei(vezi setfillstyle())
Unghiul de start si cel final sunt exprimate in grade (maxim 360).Sensul
de deplasare este inversul acelor de ceasornic cu zero grade la ora 3,90
de grade la ora 12,180 de grade la ora 9 etc.Nu returneaza valori.
EXEMPLU: #include
#include
#include
int *drv,*mod,x,y,z;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
randomize();
for(z=1;z<20;z++)
{ setfillstyle(random(10)+1,random(14)+1);
pieslice(300,220,random(360),random(360),random(200));
sleep(2); }}
-237- [ graphics.h- putimage() ]
FUNCTIA putimage()
-afiseaza pe ecran o imagine salvata anterior cu getimage()
SINTAXA GENERALA este:
void far putimage(int left,int top,void far *bitmap,int op);
Functia afiseaza pe ecran,la coordonatele left si top,o imagine salvata
anterior cu ajutorul functiei getimage().Imaginea va fi afista cu coltul
din stanga in pozitia specificata prin left si top.Parametrul op se uti-
lizeaza pentru a specifica un operator combinativ care va controla modul
de destinatie al fiecarui pixel din imaginea afisata prin compararea cu-
lorii fiecarui pixel cu cea a pixelului existent in acel moment pe ecran.
Se pot utiliza urmatoarele valori,predefinite in graphics.h:
NUME VALOARE DESCRIERE
COPY_PUT 0 Copy (copiaza identic)
XOR_PUT 1 Exclusive or (SAU exclusiv)
OR_PUT 2 Inclusive or (SAU inclusiv)
AND_PUT 3 And (si=inclusiv)
NOT_PUT 4 Copy the inverse of the source (invers)
Cu alte cuvinte,COPY_PUT copiaza imaginea sursa pe ecran,XOR_PUT aplica
operatorul XOR intre fiecare pixel din sursa si cel corespunzator de pe
ecran(compara SAU exclusiv sursa cu ecranul) etc.Nu returneaza valori.
EXEMPLU: #include
#include
#include
int *drv,*mod,x;
char *tampon;
unsigned size;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
setfillstyle(8,4);
setcolor(10);
circle(200,100,50);
circle(180,80,10);
circle(220,80,10);
bar3d(180,120,200,130,7,7);
floodfill(200,100,10);
size=imagesize(100,0,300,200);
tampon=malloc(size);
if (!tampon){ exit(1); };
getimage(100,0,300,200,tampon);
randomize();
cleardevice();
for(x=0;x<15;x++)
{ putimage(random(400),random(300),tampon,0);
sleep(1);
cleardevice();
}}
Pentru a verifica variantele parametrului optional (op) puteti umple
ecranul cu diferite imagini si repetati exercitiul dar cu alti parametri
(de exemplu 4).Functia se utilizeaza mai ales pentru a realiza grafica
animata,pentru anteturi si stampile,ferestre si icon-uri etc.
-238- [ graphics.h-putpixel(),rectangle()]
FUNCTIA putpixel()
-afiseaza pe ecran un pixel la pozitia si in culoarea specificata
SINTAXA GENERALA este: void far putpixel(int x,int y,int color);
Functia afiseaza un pixel la coordonatele x si y in culoarea color.
Nu returneaza nici o valoare.
EXEMPLU: #include
#include
#include
int *drv,*mod;
int x,y,z;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
randomize();
for(x=1;x<16;x++)
{ for(y=1;y<20;y++)
{ putpixel(25*x,22*y,x);
putpixel(500-25*x,450-22*y,x); };
for(z=x+5;z<450;z++)
{ putpixel(z,3*x,x);
putpixel(3*x,z,x); };
sleep(1);
}
}
Functia va permite sa desenati fiecare pixel al ecranului.Nu ezitati sa
incercati,fie pixel cu pixel,fie utilizand functii iterative ca in exem-
plul de mai sus.Incercati sa faceti desene pe hartie cu patratele si apoi
sa le transcrieti pixel cu pixel pe ecran(poate ca in d-voastra se as-
cunde un viitor programator de jocuri PC),sau incercati sa realizati o
semnatura electronica,o stampila,un icon,un simbol grafic etc...
Dostları ilə paylaş: |
|
|