Graafiline tekst ja aknad

Graafilises rezhiimis saab küll kasutada teksti väljastamiseks ka lihtsaid funktsioone, kuid tavaliselt kasutatakse selleks siiski funktsioone outtext() ja outtextxy().

void far outtext(char far *pString);
void far outtextxy(int x, int y, char far *pString);

Funktsioon outtext() väljastab talle üleantud sümbolitejada ekraanile, alustades hetkelisest väljastamise positsioonist ja kasutades hetkelist šrifti. Funktsioon outtextxy() seevastu alustab väljastamisega punktist (x,y). Funktsioon outtext() nihutab hetkelist väljastamise positsiooni väljastatud teksti lõppu, kui tekst väljastati normaalse suuna (HORIZ_DIR) ja hariliku joondamisega (LEFT_TEXT). Üle ekraani ulatuv tekstiosa ei esitata ekraanile. Väljastatava teksti suurus võib erineda vastavalt valitud šriftile ja suurendusele. Tekstirea laiust ja kõrgust saab arvutada funktsioonidega textwidth() ja textheight().

int far textwidth(char far *pString);
int far textheight(char far *pString);

Funktsiooniga settextstyle() saab määrata väljastamisel kasutatavat šrifti, suurust ja suunda.

void far settextstyle(int font, int direction, int charsize);

Borland C/C++ sisaldab kahte liiki šrifte: rasteršrifte ja vektoršrifte. Iga šrift on salvestatud *.CHR failis. Need failid peavad asuma funktsioonis initgraph() määratud kataloogis. Te võite ka muuta need failid abiprogrammiga BGIOBJ.EXE objektfailideks ja siduda oma programmiga, mis muudab valmis programmi natuke suuremaks. Rasteršriftid on salvestatud piklikus mustvalges rasterpildis. Tähestiku iga sümboli jaoks on selles rasterpildis reserveeritud eraldi ruudukene. Kui nüüd vastav täht väljastatakse ekraanile, siis kopeeritakse selle ruudukese sisu ekraani vastavasse punkti ja omistatakse valgetele punktidele eesplaani- ja mustadele tagaplaanivärvus. Selline väljastamine on väga kiire, kuid neid šrifte on raske suurendada. Suurendamisel asendatakse iga piksel mitme sama värvi pikseliga ja nii lähevad tähed sakiliseks. Vektoršriftid seevastu on salvestatud joone punktide jadana. Igale tähele vastavad mitu vektorit, mis kirjeldavad, kuidas seda tähte ekraanile joonistada. Enne ekraanile väljastamist muudetakse needki šriftid rasterpildiks, mis kiirendab väljastamist. Seda aga tehakse iga kord enne uue šrifti kasutamist ja nii ei ole kartust, et tähed kaotaksid suurendamisel oma kuju.

Funktsiooni settextstyle() parameeter font määrab järgnevates väljastusoperatsioonides kasutatava šrifti ja võib omada järgmisi väärtusi:


Konstant Tähendus
DEFAULT_FONT Harilik 8 x 8 pikselise ruuduga rasteršrift.
TRIPLEX_FONT Lihtne vektoršrift
SMALL_FONT Väikesepunktiline vektoršrift
SANS_SERIF_FONT Ilma serifideta vektoršrift. Serifid on sümboli tippudesse joonistatud tillukesed jooned.
GOTHIC_FONT Kalligraafilist käsikirja meenutav vektoršrift.

Tabel 18: Borland C/C++ graafilised šriftid

Parameeter direction määrab, millises suunas tekst väljastatakse ja ta võib omada järgmisi väärtusi:

Viimane parameeter - charsize - määrab suurenduse. Kui näiteks charsize väärtus on 1, siis esitatakse harilik 8 x 8 rasteršrift 8 x 8-pikselise ruudu sees. Kui aga charsize väärtus on 2, siis on iga täheruudu suuruseks 16 x 16 jne. Sel kombel saab šrifti suurendada kuni 10-kordseks. Vektoršriftide puhul võib määrata charsize väärtuseks 0, suurendus seatakse aga hoopis funktsiooniga setusercharsize().

void far setusercharsize(int multx, int divx, int multy, int divy);

Funktsiooni setusercharsize() esimesed kaks parameetrit määravad sümboli laiuse. Need parameetrid jagatakse omavahel (multx / divx) ja saadud konstandiga korrutatakse šrifti algset laiust. Samamoodi määratakse ka šrifti uus kõrgus.

Tavaliselt joondatakse väljastatav tekst vasakule ja üles, kuid funktsiooniga settextjustify() saab joondada teksti ka paremale, alla või keskele.

void far settextjustify(int horiz, int vert);

Funktsiooni settextjustify() parameetrid horz ja vert määravad vastavalt horisontaalse ja vertikaalse joondamise, ning võivad omada järgmisi väärtusi:


Parameeter Väärtus Tähendus
horz LEFT_TEXT Vasakule joondatud tekst

CENTER_TEXT Horisontaalselt keskendatud tekst

RIGHT_TEXT Paremale joondatud tekst
vert TOP_TEXT Üles joondatud tekst

CENTER_TEXT Vertikaalselt keskendatud tekst

BOTTOM_TEXT Alla joondatud tekst

Tabel 19: Graafilise teksti joondamine

Määratud teksti väljastamise parameetreid saab uuesti uurida funktsiooniga gettextsettings(), mis salvestab parameetrite hetkelised väärtused andmestruktuuri texttypeinfo.

void far gettextsettings( struct far texttypeinfo *textinfo);

struct texttypeinfo {
 int  		font;
 int 		charsize;
 int 		direction;
 int 		horiz;
 int 		vert;
};

Kõik eespoolnimetatud funktsioonid kasutavad hetkel kehtivat koordinaatidesüsteemi. Nii nagu tekstirezhiimis, võib ka graafilises rezhiimis defineerida ekraanile piirkonna (akna), millesse järgnevad väljastusoperatsioonid esitavad oma andmeid. Selleks kasutatakse funktsiooni setviewport().

void far setviewport(int x1, int y1, int x2, int y2, int clip);

Funktsioon setviewport() määrab akna, mille ülemine vasak nurk asub punktis (x1, y1) ja alumine parem nurk punktis (x2, y2). Kui parameeter clip on nullist erinev, siis lõigatakse aknasse väljastatud graafiliste kujundite üle akna piiride ulatuvad osad ära (ei väljastata ekraanile). Funktsiooni setviewport() parameetrid määratakse ekraanikoordinaatides. Kui parameetrite väärtused on kehtetud, siis jääb hetkeline aken (viewport) kehtima. Akna sees asub koordinaatide süsteemi alguspunkt akna ülemises vasakus tipus. X - telg on suunatud vasakult paremale ja Y - telg ülevalt alla.

Peale uue graafilise rezhiimi määramist loob funktsioon initgraph() automaatselt kogu ekraani pinda hõlmava akna (viewport). Hiljem võib hetkelise akna suurust uurida funktsiooniga getviewsettings().

void far getviewsettings(struct viewporttype far *viewportinfo);

struct viewporttype {
 int left;
 int top;
 int right;
 int bottom;
 int clip;
};

Funktsioon getviewsettings() täidab andmestruktuuri viewporttype vastavate andmetega.

Kogu ekraani puhastamiseks (tagaplaanivärvusega täitmiseks) kasutage funktsiooni cleardevice() ja hetkelise akna sisu puhastamiseks funktsiooni clearviewport().

void far cleardevice( void );
void far clearviewport( void );

Sõltuvalt graafikakaardist ja valitud graafilisest rezhiimist võib eksisteerida rohkem kui üks ekraanilehekülg. Ekraanilehekülg on osa graafikakaardimälust, mis suudab antud graafilises rezhiimis salvestada kogu ekraani pikselite väärtused. Ühele ekraanileheküljele väljastamine ei muuda teise lehekülje sisu. Borland C/C++ eristab aktiivse ja nähtava ekraanilehekülje vahel. Nähtav ekraanilehekülg on hetkel kasutajale nähtav ja teda määratakse funktsiooniga setvisualpage(). Aktiivne on see ekraanilehekülg, millele järgnevad väljastusoperatsioonid esitavad oma andmed ja teda seatakse funktsiooniga setactivepage().

void far setvisualpage(int page);
void far setactivepage(int page);

Järgmised graafilised rezhiimid sisaldavad mitu ekraanilehekülge:


Ohjurprogramm Graafikarezhiim Ekraanilehekülgi
EGA EGALO 4

EGAHI 2

EGAMONOHI 2 (kui mälu on 256K )
HERC HERCMONOHI 2
VGA VGALO 2

VGAMED 2

Tabel 20: Ekraanileheküljed ja graafikarezhiimid


Ekraanilehekülgi kasutatakse sageli sujuva animatsiooni programmeerimiseks. Selleks seatakse ekraan graafikarezhiimi, mis sisaldab vähemalt kahte ekraanilehekülge. Kasutajale näidatakse kõigepealt animatsiooni esimest pilti ehk kaadrit (frame). Samal ajal joonistatakse varjatud leheküljele uut kaadrit. Kui see valmis saab, siis vahetatakse ekraanilehekülgi. Nii jääb otsene uue kaadri joonistamine kasutajale nähtamatuks ja see muudab animatsiooni sujuvamaks Seda meetodit nimetatakse kahe ekraanilehekülje animatsiooniks (double buffer animation).