|
|
səhifə | 33/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| FUNCTIA rectangle()
-deseneaza un dreptunghi in culoarea,grosimea si stilul penitei
SINTAXA GENERALA este:
void far rectangle(int left,int top,int right,int bottom);
Functia deseneaza un dreptunghi la coordonatele left,top(colt stanga sus)
si right,bottom(colt dreapta jos).Nu returneaza valori.
EXEMPLU: #include
int *drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
rectangle(10,10,100,100);
setcolor(10);
rectangle(50,200,200,250);
setcolor(12);
rectangle(200,250,400,50);
setcolor(3);
rectangle(250,200,275,100);
sleep(3); }
Incercati sa utilizati functia pentru a desena drapele si stegulete,etc.
-239-[registerbgidriver()-registerbgifont()]
FUNCTIA registerbgidriver()
-permite incarcarea in memorie si utilizarea unui driver
SINTAXA GENERALA este: int registerbgidriver(void(*driver)(void));
Functia permite incarcarea unei file care contine un driver si intro-
ducerea acesteia in registrii programului.Dupa ce adresa de memorie a
fost transferata catre registerbgidriver(),functia initgraph() poate
utiliza driverul respectiv pentru initializarea modulului grafic.Fila
care contine driverul grafic,poate fi incarcata de pe disc in stiva me-
moriei de operare rezervata aplicatiei,sau poate fi convertita intr-o fila
de tip .OBJ(utilizand BGIOBJ.EXE) si apoi conectata(linkata) la aplicatie
in fila executabila(.EXE).
Apelarea functiei registerbgidriver() informeaza sistemul grafic ca
driverul spre care pointeaza a fost conectat la aplicatie.Aceasta rutina,
controleaza codul driverului specificat si daca este valid,il incarca in
registrii proprii(in memoria de operare).
Functia returneaza un cod de eroare negativ daca driverul specificat este
invalid sau returneaza numarul de inregistrare al driverului in caz ca
este valid.
EXEMPLU: #include
#include
#include
int cod;
main()
{
cod=registerbgidriver(DETECT);
printf("Codul returnat este: %d \n",cod);
sleep(3);
}
Exemplul de mai sus returneaza un cod negativ,deoarece nu exista nici o
fila "DETECT" care sa contina un driver grafic.Daca utilizati un nume
corect,pentru o fila de pe disc,functia va returna un numar pozitiv.
Puteti utiliza in acest caz,codul returnat pentru functia initgraph(),dar
cu conditia ca driverul instalat de d-voastra sa fie compatibil cu resur-
sele hardware(placa grafica).Nu incarcati la intamplare,orice driver
grafic gasit pe disc,deoarece riscati sa dereglati tot sistemul grafic.
FUNCTIA registerbgifont()
-incarca de pe disc o fila care contine fonturi grafice speciale
SINTAXA GENERALA este: int registerbgifont(void(*font)(void));
Functia se utilizeaza pentru a informa sistemul grafic ca fontul spre
care pointeaza functia a fost conectat la aplicatie si poate fi utilizat.
Rutina controleaza codul pentru fontul specificat si daca este valid il
incarca in registrii interni(in tampoanele din memoria de operare interna)
pentru a putea fi utilizat(cu outtext sau outtextxy).Fonturile implicite
sunt prezentate la functia settextstyle(). Daca utilizati o fila de fon-
turi creata de d-voastra,trebuie sa transferati rezultatul returnat de
functia registerbgifont() functiei settextstyle(),pentru ca fontul sa
poata fi utilizat(se selecteaza cu settextstyle si se apeleaza cu outtext)
Functia returneaza un cod de eroare negativ daca fontul apelat nu este
valid,sau un numar pozitiv,daca fontul a fost inclus in memoria de operare
a programului(in registrii interni ai procesorului).
-240- [ restorecrtmode() si sector() ]
EXEMPLU: #include
#include
#include
int cod;
main()
{
cod=registerbgifont(DEFAULT_FONT);
printf("Codul returnat este: %d \n",cod);
sleep(3);
}
In exemplul de mai sus,functia returneaza un cod de eroare.Fontul este
valid,dar nu exista nici o fila cu numele respectiv pe disc.Nu incercati
sa incarcati oric tip de fonturi,deoarece puteti bloca registrii interni
ai memoriei de operare si programul nu va mai functiona.Utilizati doat
file special destinate pentru modulul grafic(verificate anterior).
FUNCTIA restorecrtmode()
-reinstaleaza modul grafic detectat de functia initgraph()
SINTAXA GENERALA este: void far restorecrtmode(void);
Functia se utilizeaza pentru a reinstala rapid modul video original.
De obicei,functia se utilizeaza impreuna cu setgraphmode() pentru a trece
rapid din modul text in modul grafic al ecranului si reciproc.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
#include
int *drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
outtextxy(100,100,"Text scris in modul grafic al ecranului");
sleep(2);
restorecrtmode();
printf("Text scris in modul text al ecranului !");
sleep(3);
setgraphmode(getgraphmode());
outtextxy(100,100,"Am revenit in modul grafic !!!");
sleep(2);
restorecrtmode();
printf("Si din nou in modul text !");
sleep(3);
}
FUNCTIA sector()
-deseneaza si umple un sector de elipsa in culoarea si stilul penitei
SINTAXA GENERALA este:
void sector(int x,int y,int stangle,int endangle,int xradius,int yradius);
unde: x si y reprezinta centrul elipsei,x radius si y radius sunt raza
orizontala si respectiv verticala iar stangle si endangle sunt unghiul de
start si respectiv cel de terminare a sectorului(in grade),incepand cu
0 la ora 3,90 la ora 12,etc. In caz de eroare returneaza -6(grNoScanMem).
-241- [graphics.h-setactivepage() ]
EXEMPLU: #include
#include
int *drv,*mod,x;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
for(x=1;x<15;x++)
{ setcolor(3);
setfillstyle(1,12);
sector(250,200,25,95,100,75);
setfillstyle(2,1);
sector(250-3*x,200-3*x,100,195,100,75);
setfillstyle(3,14);
sector(250,200,210,270,100,75);
setfillstyle(8,13);
sector(250,200,280,350,100,75);
sleep(1);
cleardevice();
}}
FUNCTIA setactivepage()
-seteaza pagina curenta ca pagina activa (pot exista si pagini inactive)
SINTAXA GENERALA este: void far setactivepage(int page);
Functia este utila atunci cand exista mai multe pagini grafice simultane.
Nu toate dispozitivele si placile grafice accepta pagini grafice simultane
(trebuie sa existe memorie de RAM special alocata).Placile de tip EGA,VGA
si Hercules accepta paginile grafice simultane.Pentru aceste placi,functia
setactivepage() determina ca pagina cu numarul specificat prin page sa fie
pagina activa,adica pagina asupra careia opereaza comenzile din aplicatie.
Nu este obligatoriu ca pagina activa sa fie si vizibila pe ecran(poate sa
fie activa in fundal).Pentru a fi vizibila pe ecran,pagina trebuie sa fie
apelata cu setvisualpage() (vezi functia).Dupa ce o pagina a fost setata
ca pagina activa,toate comenzile grafice consecutive vor fi executate in
pagina respectiva (chiar daca nu sunt vizibile pe ecran).Functia este
foarte utila,mai ales atunci cand se fac operatii automate pe care nu do-
riti sa le afisati pe ecran,sau cand doriti sa fragmentati o imagine gra-
fica in mai multe parti componente care pot fi accesate independent,etc.
Este preferabil sa utilizati un numar cat mai mic de pagini simultane,
preferabil doar pagina 0 si pagina 1,deoarece consuma memoria interna de
operare a programului si memoria grafica special destinata aplicatiilor
grafice.Cu cat deschideti simultan mai multe pagini,cu atat se reduce
spatiul de memorie grafica ramas pentru restul comenzilor din aplicatie
si riscati sa blocati programul prin lipsa de memorie (out of memory).
Daca este indispensabil sa lucrati cu pagini grafice simultane,este bine
sa configurati sistemul special pentru aceasta(alocati memorie de RAM din
memoria SIM special pentru aplicatiile grafice si eventual adaugati si
un miniprogram de gestionare a memoriei RAM alocate,astfel incat sa puteti
evita epuizarea accidentala a spatiului de memorie.Functia nu returneaza
nici o valoare (motiv care ingreuneaza si mai mult munca de depanare a
programelor).Este bine sa nu utilizati aceasta functie decat cu un motiv
bine precizat (nu doar pentru artificii grafice).
-242- [graphics.h -setallpalette() ]
EXEMPLU: #include
#include
int *drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
setcolor(12);
setactivepage(1);
outtextxy(20,100,"PAGINA 1");
bar3d(100,100,300,200,50,10);
circle(300,200,50);
setvisualpage(1);
sleep(3);
setactivepage(0);
bar3d(200,250,400,400,20,20);
setvisualpage(0);
sleep(3);
setvisualpage(1);
outext("Am revenit la PAGINA 1");
sleep(3);
}
FUNCTIA setallpalette()
-seteaza intreaga paleta grafica
SINTAXA GENERALA este:
void far setallpalette(struct palettetype far *palette);
unde: -*palette este pointerul spre o structura de tip palettetype in
care sunt arhivate datele pentru fiecare culoare din paleta grafica.
Practic,se declara o structura de tip palettetype in care se introduc
datele pentru fiecare culoare (eventual cu functia automata getpalette()),
dupa care se apeleaza structura respectiva pentru a reseta in bloc toate
culorile din paleta grafica.Pentru a reseta o singura culoare se poate
utiliza functia setpalette().
EXEMPLU: #include
#include
int *drv,*mod,x;
struct palettetype paleta;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
getpalette(&paleta);
for(x=1;x<14;x++)
{ setcolor(x+1);
setfillstyle(1,1)
setpalette(1,x);
bar3d(100,100,400,300,50,10);
sleep(1); }
setallpalette(&paleta);
bar3d(100,100,400,300,50,10);
outtext("S-au resetat culorile implicite");
sleep(3); }
-243- [ graphics.h-setaspectratio() ]
Functia se utilizeaza pentru a schimba partial sau total paleta grafica.
Tipul de data palettetype si numarul maxim de culori MAXCOLORS sunt pre-
definite in graphics.h cu forma generala:
#define MAXCOLORS 15
struct palettetype { unsigned char size;
signed char colors[MAXCOLORS+1]; };
unde size exprima numarul de culori din paleta grafica astfel definita
iar colors este aria de date care contine codul pentru fiecare culoare
din paleta.Daca un element al ariei colors contine valoarea -1,atunci
culoarea respectiva din paleta grafica nu va fi schimbata la apelarea
functiei(repectiv a ariei de date).Elementele din aria colors pot fi date
de tip int(codurile culorilor) sau constantele simbolice ale fiecarei
culori,asa cum sunt definite in COLORS din graphics.h(RED,GREEN etc.)
Functia nu poate fi apelata pentru driverul IBM-8514.
Daca apelarea functiei setallpalette() transfera din structura specificata
date invalide,functia returneaza codul de eroare -11(grError) iar culorile
din paleta grafica raman nemodificate.
Se recomanda utilizarea functiei pentru resetarea valorilor implicite
ale paletei grafice,dupa ce a-ti modificat paleta grafica in cursul
unei aplicatii (pentru a nu modifica aspectul grafic al celorlate apli-
catii din program).
FUNCTIA setaspectratio()
-modifica rezolutia ecranului (dimensiunile fiecarui pixel)
SINTAXA GENERALA este: void far setaspectratio(int xasp,int yasp);
unde: xasp si yasp sunt rezolutia orizontala si respectiv verticala a
ecranului.Functia modifica intregul sistem grafic prin schimbarea aspect-
ului pentru fiecare pixel(vezi si getaspectratio()).Sistemul grafic uti-
lizeaza valorile implicite astfel incat cercurile desenate sa fie perfect
rotunde.La orice alte valori,cercurile desenate devin elipse.
EXEMPLU: #include
#include
int *drv,*mod,asx,asy,x;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
getaspectratio(&asx,&asy);
for(x=1;x<16;x++);
{ setaspectratio(asx-500*x,asy);
setcolor(12);
circle(250,220,100);
ellipse(400,50,0,360,40,20);
sleep(2);
}
cleardevice();
setcolor(3);
setaspectratio(asx,asy);
circle(250,220,100);
ellipse(400,50,0,360,40,20);
outtext("S-au resetat valorile implicite ale pixelilor!");
sleep(3); }
-244- [graphics.h -setbkcolor()-setcolor()]
FUNCTIA setbkcolor()
-seteaza culoarea de fond a ecranului
SINTAXA GENERALA este: void far setbkcolor(int color);
Functia seteaza culoarea de fond a ecranului in culoarea specificata prin
codul culorii sau prin simbolul acesteia.Functia accepta urmatoarele
valori: 0 (BLACK),1 (BLUE),2 (GREEN),3 (CYAN),4 (RED),5 (MAGENTA),
6 (BROWN),7 (LIGHTGRAY),8 (DARKGRAY),9 (LIGHTBLUE),10 (LIGHTGREEN),
11 (LIGHTCYAN),12 (LIGHTRED),13 (LIGHTMAGENTA),14 (YELLOW),15 (WHITE)
Astfel pentru a seta culorea de fond a ecranului in albastru,se poate
utiliza oricare dintre variantele: setbkcolor(BLUE); sau setbkcolor(1);
La sistemele CGA si EGA,functia schimba culoarea de fond modificand prima
intrare din paleta grafica.Din acest motiv,la adaptoarele EGA si VGA,se
poate intampla ca modificarea paletei grafice cu setpallette() sau cu
setallpalette() sa nu returneze culoarea dorita,deoarece functia setbk-
color() va indica numarul de intrare in paleta grafica in loc sa spe-
cifice o anumita culoare.Daca se apeleaza setbkcolor(0),fondul ecranului
va fi negru,indiferent de tipul de adaptor si placa grafica.
Functia nu returneaza nici o valoare(nu incercati sa o "depanati").
EXEMPLU: #include
#include
int *drv,*mod,x:
main()
{ drv=DETECT;
initgraph(drv,mod,"");
for(x=1;x<16;x++)
{ setactivepage(1);
setbkcolor(x);
bar3d(100,100,400,200,50,10);
setvisualpage(1);
sleep(1);
setactivepage(0);
setbkcolor(x-1);
circle(250,300,50);
setvisualpage(0);
sleep(1);
}}
FUNCTIA setcolor()
-seteaza culoarea de desen a penitei (pentru linii,text etc.)
SINTAXA GENERALA este: void far setcolor(int color);
Functia seteaza culoarea penitei grafice la culoarea specificata.Pentru
color se poate utiliza fie un numar de cod de tip int,fie simbolul
culorii asa cum este definit in COLORS din graphics.h
Pentru adaptoarele CGA,valorile acceptate sunt: 01 (CGA_LIGHTGREEN),
02 (CGA_LIGHTRED),03 (CGA_YELLOW),11 (CGA_LIGHTCYAN),12 (CGA_LIGHTMAGENTA)
13 (CGA_WHITE),21 (CGA_GREEN),22 (CGA_RED),23 (CGA_BROWN),31 (CGA_CYAN),
32 (CGA_MAGENTA),33 (CGA_LIGHTGRAY) unde prima cifra specifica numarul
paletei grafice selectate iar a doua cifra este codul culorii (pentru
functia setcolor() se va utiliza un numar de la 1 la 3,dupa selectarea
paletei intre 0 si 3).
Pentru adaptoarele EGA,codurile si simbolurile sunt ca la setbkcolor().
-245- [ graphics.h -setfillpattern() ]
Pentru selectarea culorii penitei se poate utiliza fie codul numeric,
fie simbolul de tip caracter.Astfel,de exemplu,pentru un adaptor de tip
CGA,daca se opteaza pentru paleta grafica zero (GCA0),se vor putea uti-
liza culorile LIGHTGREEN,LIGHTRED sau LIGHTYELLOW.Pentru a utiliza culoa-
rea galbena,se va specifica fie setcolor(3); fie setcolor(CGA_YELLOW).
Pentru un adaptor de tip EGA,culoarea galben se va seta fie cu comanda
setcolor(14); fie cu comanda setcolor(YELLOW) (vezi si COLORS)
Functia nu returneaza nici o valoare (nu incercati sa o "depanati").
EXEMPLU: #include
#include
int *drv,*mod,x;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
for(x=0;x<12;x++)
{ setcolor(x+1);
setfillstyle(x,x);
bar3d(100,100,400,200,50,10);
sleep(2);
}}
FUNCTIA setfillpattern()
-seteaza un model predefinit de utilizator,pentru penita grafica
SINTAXA GENERALA este:
void far setfillpattern(char far *upattern,int color);
unde *upattern este pointerul spre modelul grafic definit de catre uti-
lizator sub forma unei arii de 8 bytes in care fiecare byte corespunde
pentru 8 pixeli din modelul grafic rezultat.Pentru fiecare bit din
definitie setat la o valoare de 1(pozitiva),pixelul corespunzator din
modelul grafic rezultat va fi reprezentat in culoarea specificata prin
color.
Functia este asemanatoare cu setfillstyle(),dar se utilizeaza pentru
modele grafice definite de catre utilizator.Functia setfillstyle() ape-
leaza modele grafice predefinite in graphics.h.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
int *drv,*mod;
char model1[8]={0xAA,0x55,0xAA,0x55,0x11,0x00,0x77,0xAA};
char model2[8]={0x00,0x00,0x11,0x11,0x00,0x00,0x11,0x11};
main()
{ drv=DETECT;
initgraph(drv,mod,"");
setfillpattern(model1,3);
bar3d(100,100,400,300,50,10);
sleep(3);
setfillpattern(model2,14);
bar3d(100,100,400,300,50,10);
sleep(3);
}
Nu ezitati sa experimentati modele grafice definite de d-voastra.
-246- [ setfillstyle()-setgraphbufsize() ]
FUNCTIA setfillstyle()
-seteaza modelul grafic si culoarea pentru umplerea imaginilor
SINTAXA GENERALA este: void far setfillstyle(int pattern,int color);
Functia seteaza modelul grafic predefinit,utilizat pentru umplerea
imaginilor (cu floodfill(),etc.) si culoarea de umplere.Cele 12 modele
grafice predefinite in graphics.h sunt: 0 (EMPTY_FILL) ,1(SOLID_FILL) ,
2 (LINE_FILL) ,3 (LTSLASH_FILL) ,4 (SLASH_FILL) ,5 (BKSLASH_FILL),
6 (LTBKSLASH_FILL) ,7 (HATCH_FILL) ,8 (XHATCH_FILL) ,9 (INTERLEAVE_FILL),
10 (WIDE_DOT_FILL) ,11 (CLOSE_DOT_FILL) ,12 (USER_FILL).
Daca doriti sa utilizati un model grafic definit de d-voastra este prefe-
rabil sa apelati functia setfillpattern() decat sa apelati setfillstyle()
cu parametrul 12 sau USER_FILL,deoarece este mai explicita.Pentru cele-
lalte modele grafice,se poate utiliza fie codul numeric,fie numele simbo-
Dostları ilə paylaş: |
|
|