Joonelemendid on jooned, ringid, ellipsid, ristkülikud jne. Kui määrata iga kujundi jaoks kõikmõeldavad graafilised parameetrid, siis omaksid need funktsioonid liiga palju parameetreid ja ei oleks seega ülevaatlikud. Seepärast salvestatakse osa parameetreid, nagu näiteks ees- ja tagaplaani värv, ohjurprogrammi muutujates ja neid väärtusi kasutatakse siis iga järgneva väljastusoperatsiooni puhul. Kui te näiteks soovite joonistada punase ringjoone, siis tuleb kõigepealt määrata funktsiooniga setcolor() esiplaanivärviks punane (kui ta seda juba ei ole) ja joonistada seejärel ringjoon.
void far setcolor(int nNewColor);
Funktsiooni setcolor() parameeter nNewColor peab olema mingi hetkelise värvitabeli sissekande järjekorranumber. Kui hetkeline eesplaanivärvus juba oli punane, siis ei tee see funktsioon kah midagi paha. Kui te aga soovite kindel olla, siis kasutage funktsiooni getcolor().
int far getcolor( void );
Üldiselt tuleb öelda, et eesplaanivärvuse uurimine võtab täpselt sama palju aega, kui tema määramine, nii et kui te just programmi kulu järgi ei oska öelda, milline on hetkeline eesplaanivärvus, siis parem muutke kohe ja ärge hakake uurima, milline värv oli.
Peale eesplaanivärvuse mõjutab joonelementide välimust veel joone tüüp. Selle atribuudi määramiseks kasutage funktsiooni setlinestyle().
void far setlinestyle(int linestyle, unsigned pattern, int thickness);
Funktioon setlinestyle() määrab korraga kolm atribuuti. Parameeter linestyle määrab joone tüübi ja võib omada järgmisi väärtusi:
Kui parameetri linestyle väärtus on USERBIT_LINE, siis määrab parameeter pattern joone tegeliku stiili. See parameeter on 16-bitine positiivne täisarv, mis iseloomustab mustrit. Iga 1-ga võrduv bitt selles arvus määrab, et vastav piksel ekraanil joonistatakse eesplaani värviga ning ülejäänud tagaplaani värviga. Näiteks kui parameetri pattern väärtus on 1 (mis kahendkoodis oleks 0000000000000001), siis ilmub ekraanile iga 16 pikseli järel üks punkt. Väärtuse 65.535 (0xFFFF) puhul aga ilmub ekraanile pidev joon.
Parameeter thickness määrab joone laiuse pikselites. Esialgu on lubatud vaid väärtused:
Funktsioon getlinestettings() hangib kõik nimetatud andmed ja salvestab nad andmestruktuuri linesettingstype.
void far getlinesettings( struct far linesettingstype *settings);
struct linesettingstype {
int linestyle;
unsigned upattern;
int thickness;
};
Ühe sirgjoone joonistamiseks ekraanile võib kasutada funktsioone line() ja lineto() ja linerel().
void far line(int x1, int y1, int x2, int y2); void far lineto(int x, int y); void far linerel(int dx, int dy);
Funktsioon line() joonistab sirgjoone punktist (x1, y1) punkti (x2, y2), kasutades hetkelist eesplaani värvust ja joonetüüpi. Algselt on koordinaatidesüsteemi alguspunkt ekraani ülemises vaskus nurgas ja erinevalt tekstirezhiimist on esimese punkti koordinaadid (0, 0), mitte (1, 1). Seejuures on X- telg suunatud vasakult paremale ja Y - telg ülevalt alla. Koordinaatidesüsteemi ühikud vastavad pikselitele, kuid nii telgede asetust, suunda, kui ka koordinaatidesüsteem ühikute pikkusi saab muuta. Sellest täpsemalt järgnevates peatükkides. Suurima X ja Y - väärtuse saab teada funktsioonidega getmaxx() ja getmaxy().
int far getmaxx( void ); int far getmaxy( void );
Joonisel 12 näete funktsioonide line(), lineto() ja linrel() mõju.

Joonis 12: Funktsioonid line(), lineto() je linerel()
Funktsioonid lineto() ja linerel() kasutavad nn. hetkelist väljastamise punkti, mis joonisel 11 on märgitud koordinaatidega (x0, y0). Algselt asub see punkt koordinaatide alguspunktis, kuid suur osa funktsioone, mis midagi ekraanile väljastavad, nihutavad selle punkti oma väljastatud andmete lõppu, et järgmised funktsioonid äsjaväljastatud andmeid üle ei kirjutaks. Selle punkti koordinaate saab uurida funktsioonidega getx() ja gety(), ning määrata funktsiooniga moveto(), moverel().
int far getx( void ); int far gety( void ); void far moveto(int x, int y); void far moverel(int dx, int dy);
Funktsioon moveto() nihutab hetkelise väljastamise punkti lihtsalt punkti (x, y), funktsioon moverel() seevastu liidab hetkelise punkti koordinaatidele väärtused dx ja dy, ning arvutab sel kombel uue hetkelise punkti.
Funktsioon line() ei mõjuta mingil määral hetkelist punkti ega kasuta ka tema andmeid. Funktsioon lineto() seevastu tõmbab joone hetkelisest punktist punkti (x, y) ja funktsioon linerel() joonistab sirge hetkelisest punktist punkti, mille koordinaadid on hetkelise punkti omadest (dx, dy) võrra suuremad. Muidugi tohivad need parameetrid (dx ja dy) olla ka negatiivsed.
Üheainsa pikseli värvuse määramiseks kasutage funktsiooni putpixel() ja tema värvuse uurimiseks funktsiooni getpixel().
void far putpixel(int x, int y, int nColor); unsigned far getpixel(int x, int y);
Ka graafilises rezhiimis on võimalik salvestada terve ekraanipiirkonna sisu eraldi mälublokki ja hiljem see uuesti ekraanile väljastada. Selleks kasutatakse funktsioone getimage() ja putimage().
void far getimage(int x1, int y1, int x2, int y2, void far *bitmap); void far putimage(int x1, int y1, void far *bitmap, int options);
Funktsioon getimage() koperib ekraanilt ristkülikukujulise piirkonna (x1, y1) - (x2, y2) parameetri bitmap poolt viidatud puhvrisse. Seejuures kasutatakse selle puhvri esimest kahte 16-bitist arvu salvestatud rasterpildi laiuse ja kõrguse salvestamiseks. Puhver peab olema küllaldaselt suur kogu informatsiooni salvestamiseks ehk: (x2 - x1) * (y2 - y1) * <bitti pikseli kohta> / 8. Selle suuruse arvutamiseks on mugavam kasutada funktsiooni imagesize().
unsigned far imagesize(int x1, int y1, int x2, int y2);
Funktsioon imagesize() arvutab määratud suurusega rasterpildi suuruse baitides, võttes arvesse ka hetkelist graafikarezhiimi. Kui soovitud rasterpilt osutub liiga suureks (s.o. suurem kui 64 KB), siis loovutab funktsioon imagesize() väärtuse -1.
Funktsioon putimage() väljastab salvestatud rasterpildi uuesti ekraanile, alustades punktist (x, y) ja kasutades seejuures parameetriga options määratud valikuid. Nimetatud parameeter määrab, kuidas rasterpildi pikselite värvused seotakse ekraani pikselite värvustega ja võib omada järgmises tabelis näidatud väärtusi.
| Sümboolne konstant | Tähendus |
|---|---|
| COPY_PUT | Kopeerib rasterpildi ekraanile, kirjutades selle piirkonna üle uute väärtustega. |
| XOR_PUT | Ühendab rasterpildi pikselite värvused ekraani antud piirkonna pikselite värvusega loogilise XOR funktsiooni abil. Selle valiku abil saab samasse kohta eelnevalt väljastatud rasterpilti uuesti ekraanilt eemaldada. |
| OR_PUT | Ühendab rasterpildi pikselite värvused ekraani antud piirkonna pikselite värvusega loogilise OR funktsiooni abil. |
| AND_PUT | Ühendab rasterpildi pikselite värvused ekraani antud piirkonna pikselite värvusega loogilise AND funktsiooni abil. |
| NOT_PUT | Kannab ekraanile inverteeritud rasterpildi. |
Tabel 16: Funktiooni putimage() parameetri options väärtused
Mustvalge rasterpildi üksikud bitid määravad, kas antud pikseli värvus on valge (1) või must (0). Nimetatud valikud mõjutavad seda, mil kombel rasterpildi ja ekraani pikselite väärtused omavahel kombineeritakse. Kui te kasutate näiteks valikut AND_PUT, siis kombineeritakse rasterpildi ja ekraani vastavad pikselid loogilise AND funktsiooni abil. Loogilise AND funktsiooni väärtus on teatavasti vaid siis 1, kui mõlemad parameetrid on ühesugused. Seega "soosib" see valik musti pikseleid, valged pikselid esitatakse ekraanile aga vaid siis valgetena, kui nad satuvad juba valgele aluspõhjale. Loogiline OR funktsioon on selle täielik vastand. Sel juhul esitatakse valged pikselid ekraanile alati valgetena, mustad aga ainult siis, kui nad satuvad juba mustale aluspõhjale. Loogiline XOR funktsioon on vaid siis 1, kui mõlemad parameetrid omavad üksteisest erinevaid väärtusi. Seega kui sama rasterpilt kantakse valiku XOR_PUT abil ekraanile, siis satuvad samad pikselite väärtused uuesti samale kohale ja XOR funktsioon kustutab nad. Värvilise rasterpildi puhul kombineeritakse iga värvitasandi pikselite väärtused valitud loogilise funktsiooni abil ekraani vastava värvitasandi pikselite väärtustega. Värvitasanditeks nimetatakse ekraani iga pikseli salvestamiseks kasutatud bittide väärtusi. Näiteks kui ekraan on graafilises rezhiimis, mis suudab esitada korraga 16 erinevat värvi, siis kasutatakse iga pikseli jaoks 4 bitti, mis määravad põhivärvuste - punane, roheline, sinine - intensiivsuse väärtused. Kui iga biti väärtus on 1, siis on punase, sinise ja rohelise segu valge. Kuna iga pikseli jaoks kasutatakse nimetatud 4 bitti, siis saab ekraani jaotada mõtteliselt neljaks eri tasandiks, mis määravad vastavalt punase- rohelise- ja sinise osapildi. Neid tasandeid nimetataksegi värvitasanditeks.
Funktioone getimage() ja putimage() kasutatakse sageli animatsiooni programmeerimiseks. Rasterpildi kopeerimine ekraanimällu on tunduvalt kiirem, kui selle pildi arvutamine ja vastavate graafiliste kujundite joonistamine.
Ristküliku joonistamiseks kasutage funktsiooni rectangle().
void far rectangle(int x1, int y1, int x2, int y2);
Nimetatud funktsioon joonistab ekraanile ristküliku punktist (x1, y1) - ülemine vasak punkt punkti (x2, y2) - alumine parempoolne punkt. Ristküliku joonistamiseks kasutatakse hetkelist eesplaani värvust, joonetüüpi ja -laiust. Ristküliku sisu ja hetkelist väljastamise punkti ei muudeta.
Suvalise hulknurga joonistamiseks võib kasutada funktsiooni drawpoly().
void far drawpoly(int numPoints, int far *points);
Funktsioon drawpoly() joonistab hulknurga, ühendades parameetri points poolt osutatud punktide massiivi iga punkti järgmise punktiga. Parameeter numPoints määrab massiivi points sissekannete arvu. Massiiv points sisaldab numPoints * 2 täisarvu. Iga arvude paar määrab ühe punkti ekraanil (x, y). Suletud N - tipuga hulknurga joonistamiseks määrake N + 1 punkti, millest viimane vastab esimesele.
Ringjoone joonistamiseks kasutage funktsiooni circle().
void far circle(int x, int y, int radius);
Funktsioon circle() joonistab ekraanile ringjoone keskpunktiga (x, y) ja raadiusega radius. Ellipsi joonistamiseks kasutage funktsiooni ellipse().
void far ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);
Funktsioon ellipse() joonistab ekraanile elliptilise kaare, millele vastava ellipsi keskpunkt asub punktis (x,y) ja mille poolteljed on xradius ja yradius. Kaare joonistamisega alustatakse nurgast stangle ja lõpetatakse nurgas endangle. Nurki mõõdetakse kraadides ja vastupäeva. Seda näete ka joonisel 13.

Joonis 13: Nurgad ja ellipsid
Samasuguse kaare, kuid ringikujulise, joonistab funktsioon arc().
void far arc(int x, int y, int stangle, int endangle, int radius);
Kui alustada nurgast 0 ja lõpetada nurgaga 360, saab selle funktsiooniga joonistada ka suletud ringjoone.
Ka joonelementide puhul saab määrata, mil moel nad kombineeritakse ekraanil juba asuvate pikselitega. Selleks kasutage funktsiooni setwritemode().
void far setwritemode(int mode);
Funktsioon setwritemode() parameeter mode võib omada väärtusi COPY_PUT ja XOR_PUT, mis omavad eespoolmainitud tähendusi.