Sunteți pe pagina 1din 13

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR.

Moduri de lucru cu monitoarele video ale calculatoarelor personale


Scopul lucrrii
a) Studiul modului de lucru text. b) Studiul modului de lucru grafic. c) Utilizarea funciilor de nivel nalt pentru controlul modurilor de lucru ale monitoarelor video.

6.1. Introducere
Pentru un calculator personal (PC) exist dou moduri diferite de afiare a informaiilor pe un ecran: mod text (caractere alfabetice, numerice, de punctuaie i speciale) i mod grafic. Toate dispozitivele de afiare, numite monitoare sau display-uri utilizeaz tehnica de compunere a imaginilor text sau grafice prin aprinderea pe ecran cu intensiti i culori diferite a unor zone de dimensiuni foarte reduse, aproape punctiforme, numite pixeli, organizate ntr-o reea de puncte. Densitatea acestei reele de puncte ale ecranului, numit rezoluie, constituie o caracteristic important a echipamentului, considerat cu att mai bun cu ct rezoluia este mai mare. Alte caracteristici care le difereniaz sunt: numrul de culori, viteza de afiare, numrul de puncte alocate zonei de afiare a unui caracter, etc. Interfaarea monitoarelor cu unitatea central este realizat prin intermediul unor dispozitive numite adaptoare, cum ar fi: CGA (Color Grafics Adapter), EGA (Extended Grafics Adapter), VGA (Video Grafics Adapter).

6.2. Modul grafic


n mod grafic, monitorul unui PC lucreaz ca un televizor, afind o imagine format dintrun numr mare de puncte independente, numite elemente de imagine sau pixeli. Culoarea i luminozitatea fiecrui pixel pot fi stabilite independent de culoarea i luminozitatea celorlali pixeli. Imaginea afiat de monitorul video este format dintr-un numr oarecare de linii orizontale, fiecare linie avnd un numr oarecare de pixeli. Produsul acestora reprezint numrul total de pixeli sau rezoluia ecranului. Rezoluiile tipice ale ecranelor video n mod grafic sunt: adaptor (driver) CGA moduri grafice (graphics_modes) CGAC0 CGAC1 CGAC2 CGAC3 CGAHI MCGAC0 MCGAC1 MCGAC2 cod 0 1 2 3 4 0 1 2 coloane x linii 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 320 x 200 320 x 200 320 x 200
1

MCGA

palet culori C0 C1 C2 C3 2 culori C0 C1 C2

pagini 1 1 1 1 1 1 1 1

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 MCGAC3 MCGAMED MCGAHI EGA EGALO EGAHI EGA64 EGA64LO EGA64HI EGA-MONO EGAMONOHI EGAMONOHI HERC HERCMONOHI ATT400 ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400MED ATT400HI VGA VGALO VGAMED VGAHI PC3270 PC3270HI IBM8514 IBM8514HI IBM8514LO 3 4 5 0 1 0 1 3 3 0 0 1 2 3 4 5 0 1 2 0 1 0 320 x 200 640 x 200 640 x 480 640 x 200 640 x 350 640 x 200 640 x 350 640 x 350 640 x 350 720 x 348 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 640 x 400 640 x 200 640 x 350 640 x 480 720 x 350 1024 x 760 640 x 480 C3 2 culori 2 culori 16 culori 16 culori 16 culori 4 culori 2 culori 2 culori 2 culori C0 C1 C2 C3 2 culori 2 culori 16 culori 16 culori 16 culori 2 culori 256 culori 256 culori 1 1 1 4 2 1 1 1 2 2 1 1 1 1 1 1 2 2 1 1

6.3. Modul text


n mod text, caracterele sunt afiate pe linii, de la stnga la dreapta ecranului i de sus n jos. Poziia curent de afiare este indicat de un cursor, care se mut automat, odat cu afiarea caracterelor. Cnd cursorul atinge ultima poziie a ecranului (ultimul caracter al ultimului rnd) ntregul text afiat pe ecran se mut n sus cu o poziie, pierzndu-se textul aflat pe prima linie i crendu-se spaiu pentru o linie nou, la baza ecranului. Cursorul este poziionat n stnga noii linii. n mod text, pentru fiecare caracter se pstreaz n memorie dou informaii: codul caracterului care se afieaz, i culorile utilizate pentru desenarea caracterului i respectiv a fundalului pe care se face afiarea. Structura octetului care codific culorile de afiare este: B F F F C C C C
7 6 5 4 3 2 1 0

unde

B = mod afiare (0 = continu, 1 = intermitent); FFF = codul culorii utilizate pentru fundal; CCCC = codul culorii utilizate pentru afiarea caracterului. n afar de caracterele ASCII obinuite: litere, cifre, semne de punctuaie, pentru afiarea pe ecran se pot utiliza i caractere speciale din setul ASCII extins. Caracterele care fac parte din acest set i nu fac parte din cel clasic sunt cele semigrafice, cu care se pot face diferite desene, caractere din alfabetul grecesc i caractere cu specific matematic. Pentru a indica poziia curent, pe ecran se afieaz un cursor de form dreptunghiular, a crui dimensiune n cadrul unui caracter poate fi controlat prin program.

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 Pentru a memora coninutul ecranului se utilizeaz o zon de memorie special n afara spaiului de memorie utilizat pentru programe, denumit memorie ecran. Numrul maxim de puncte ce pot fi afiate i numrul de culori utilizate pentru aceasta, n modul grafic determin dimensiunea memoriei ecran. Pentru o interfa clasic memoria utilizat pentru ecran are adresa de segment 0xB800. Deoarece pe ecran exst mult mai multe puncte dect caractere, n memoria ecran pot fi memorate informaiile corespunztoare mai multor imagini de ecran text. De exemplu, pentru un ecran text n rezoluie mare sunt necesari 80 x 25 x 2 = 4000 octei. n cazul unei interfee standard, memoria ecran are 16 koctei, n aceast memorie se pot pstra informaiile pentru patru ecrane de tip text. Dintre aceste ecrane la un moment dat este activ (selectat) unul singur. Adresa ocupat n memoria ecran de ctre informaia corespunztoare unui caracter este: adr_car = (linie * 80 + coloana) * 2 + nr_ecran * 4096 Rezoluiile tipice ale ecranelor video n mod text sunt: - CGA: 25 de rnduri a 80 sau 40 de coloane de caractere n matrici de 8x8 pixeli, 16 culori; - EGA: 25 sau 43 de rnduri a 80 de coloane de caractere n matrici de 7x16 pixeli, 16 culori; - VGA: 25 sau 50 de rnduri a 80 de coloane de caractere n matrici de 9x16 puncte, 16 culori.

6.4. Exemple de funcii C pentru controlul monitorului video


6.4.1. Configurarea sistemului grafic detectgraph : Determinarea driver-ului i a modului grafic utilizate verificnd hardware-ul

Declaraie: void far detectgraph(int far *graphdriver, int far *graphmode); Parametru Semnificatie *graphdriver intreg care specific driver-ul grafic utilizat (constant din enum. graphics_drivers) *graphmode specific modul grafic initial (valoare din enum graphics_modes) Observaie: detectgraph detecteaz adaptorul grafic al sistemului i alege modul care ofer cea mai mare rezolutie pentru adaptor.
initgraph : iniializeaz sistemul grafic

Declaraie: void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver); Parametru *graphdriver *graphmode pathtodriver Semnificatie intreg care specific driver-ul grafic utilizat (constant din enum. graphics_drivers) specific modul grafic initial (valoare din enum graphics_modes) specific calea ctre directorul n care initgraph caut driver-ele grafice (*.BGI) mai nti (dac nu sunt acolo, initgraph caut n directorul curent); dac pathtodriver este nul, fiierele driver trebuie s fie n directorul curent

Observaii: Pentru a utiliza sistemul grafic, trebuie mai nti apelat initgraph.
3

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6

initgraph iniializeaz sistemul grafic ncrcnd driver-ul grafic de pe disc (sau validnd un driver nregistrat) trecnd astfel sistemul n mod grafic. initgraph reseteaz toate setrile grafice (culoare, palet, poziie curent, etc.) la valoarea lor implicit i reseteaz graphresult la 0. Dup apelul initgraph, *graphdriver este setat la driver-ul grafic curent, iar *graphmode este setat la modul grafic curent. Se poate cere initgraph s utilizeze un driver i mod grafic particular, sau s autodetecteze adaptorul video ataat curent. Dac se cere initgraph s autodetecteze (*graphdriver = DETECT), el apeleaz detectgraph pentru a selecta driver-ul i modul grafic la cea mai mare rezoluie disponibil pentru driver-ul detectat.
graphics_drivers : enumerare constant valoare DETECT 0 (cere autodetecie) CGA 1 MCGA 2 EGA 3 closegraph : nchide sistemul grafic constant valoare EGA64 4 EGAMONO 5 IBM8514 6 HERCMONO 7 constant ATT400 VGA PC3270 valoare 8 9 10

Declaraie: void far closegraph(void); Observaie: closegraph elibereaz toat memoria alocat pentru sistemul grafic, apoi reface ecranul n modul anterior apelului initgraph.
setviewport : Set-eaz fereastra grafic curent

Declaratie: void far setviewport(int left, int top, int right, int bottom, int clip); Observaii: (left,top) este colul din stnga-sus, iar (right,bottom) este colul din dreapta-jos al ferestrei. Poziia curent (CP) este mutat n (0,0) al noii ferestre
setactivepage : Set-eaz pagina activ setvisualpage : Set-eaz pagina vizibil

Declaraii:

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

getcolor : returneaz culoarea curent pentru desenare setcolor : set-eaz culoarea curent pentru desenare

Declaraii:

int far getcolor(void); void far setcolor(int color);

getbkcolor : returneaz culoarea curent pentru fond setbkcolor : set-eaz culoarea curent pentru fond
4

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6

Declaraii:

int far getbkcolor(void); void far setbkcolor(int color);

CGA_COLORS : enumerare Nume palet 1 CGA0 CGA_LIGHTGREEN CGA1 CGA_LIGHTCYAN CGA2 CGA_GREEN CGA3 CGA_CYAN CGA_LIGHTGRAY EGA_ COLORS : enumerare Constant EGA_BLACK EGA_BLUE EGA_GREEN EGA_CYAN EGA_RED EGA_MAGENTA EGA_LIGHTGRAY EGA_BROWN 0 1 2 3 4 5 7 20 Constant asociat 2 CGA_LIGHTRED CGA_LIGHTMAGENTA CGA_RED CGA_MAGENTA 3 CGA_YELLOW CGA_WHITE CGA_BROWN

Valoare

Constant 56

Valoare 57 58 59 60 61 62 63

EGA_DARKGRAY EGA_LIGHTBLUE EGA_LIGHTGREEN EGA_LIGHTCYAN EGA_LIGHTRED EGA_LIGHTMAGENTA EGA_YELLOW EGA_WHITE

settextstyle : set-eaz caracteristicile curente ale textului

Declaratie:

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

6.4.2. Utilizarea sistemului grafic cleardevice : terge ecranul grafic

Declaraie: void far cleardevice(void);


tergerea const n acoperirea cu culoarea curent a fundalului Observaii: cleardevice terge ntregul ecranul grafic i muta CP (poziia punctului curent) n origine (0,0). imagesize : returneaz numrul de octei necesari pentru stocarea unei imagini

Declaraie: unsigned far imagesize(int left, int top, int right, int bottom);
getimage : salveaz o imagine dintr-o regiune specificat n memorie putimage : pune o imagine pe ecran

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6

Declaraii:

void far getimage(int left, int top, int right, int bottom, void far *bitmap); void far putimage(int left, int top, void far *bitmap, int op);

Observaii: putimage repune o imagine anterior salvat cu getimage pe ecran, cu colul din stnga sus n (left,top). getimage copiaz o imagine de pe ecran n memorie. Parametru bitmap
op

Semnificatie adresa unei zone din memorie n care este salvat imaginea; primele dou cuvinte ale zonei sunt utilizate pentru limea i nlimea dreptunghiului specific un operator de combinare care controleaz modul de calcul al culorii pentru fiecare pixel destinaie pe ecran, bazndu-se pe pixel-ul aflat deja pe ecran i sursa corespunztoare din memorie

putimage_ops: putimage_ops enumerare, d numele operatorilor de combinare pentru putimage. Constant Valoare Funcie COPY_PUT 0 Copiaz imaginea surs pe ecran XOR_PUT 1 OR eXclusiv ntre imaginea surs i cea aflat deja pe ecran OR_PUT 2 OR ntre imaginea surs i cea aflat deja pe ecran AND_PUT 3 AND ntre imaginea surs i cea aflat deja pe ecran NOT_PUT 4 Copiaz inversul imaginii surs pe ecran getmaxx : returneaz coordonata x (ordonata) maxim a ecranului getmaxy : returneaz coordonata y (abscisa) maxim a ecranului int far getmaxx(void); int far getmaxy(void); getx : returneaz poziia curent a coordonatei x gety : returneaz poziia curent a coordonatei y

Declaraii:

Declaraii:

int far getx(void); int far gety(void);

moverel : mut poziia curent (CP) la o distan relativ moveto : mut CP n (x, y)

Declaraii:

void far moverel(int dx, int dy); void far moveto(int x, int y);

getpixel : obine culoarea unui pixel specificat (x,y) putpixel : deseneaz un pixel ntr-un punct specificat (x,y)

Declaraii:

unsigned far getpixel(int x, int y); void far putpixel(int x, int y, int color);

line : deseneaz o linie ntre dou puncte specificate


6

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 linerel : deseneaz o linie la distan relativ fa de poziia curent (CP) lineto : deseneaz o linie din CP la (x,y) void far line(int x1, int y1, int x2, int y2); void far linerel(int dx, int dy); void far lineto(int x, int y); Observaii: line deseneaz o linie de la (x1, y1) la (x2, y2) utiliznd culoarea, stilul liniei, i grosimea curente fr a modifica poziia punctului curent (CP). linerel deseneaz o linie de la CP la un punct care este la o distan relativ (dx, dy) fa de CP, apoi avanseaz CP cu (dx, dy). lineto deseneaz o linie de la CP la (x, y), apoi mut CP n (x, y). rectangle : deseneaz un dreptunghi (n mod grafic)

Declaraii:

Declaraie: void far rectangle(int left, int top, int right, int bottom); Observaii: rectangle deseneaz un dreptunghi cu culoarea, stilul liniei, i grosimea curente. (left,top) este colul din stnga-sus al dreptunghiului, iar (right,bottom) este colul din dreapta-jos al dreptunghiului.
arc : deseneaz un arc de cerc circle : deseneaz un cerc pieslice : deseneaz i umple un sector de cerc

Declaraii:

void far arc(int x, int y, int stangle, int endangle, int radius); void far circle(int x, int y, int radius); void far pieslice(int x, int y, int stangle, int endangle, int radius);

Parametru (x,y) stangle endangle radius

Semnificatie Centrul cercului Unghiul iniial n grade Unghiul final n grade Raza cercului

outtext : afieaz un ir de caractere ntr-o fereastr video outtextxy : afieaz un ir de caractere ntr-o locaie specificat (x,y)

Declaraii:

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

6.4.3. Configurarea modului text textattr : set-eaz atributele textului pentru ferestre de text textbackground : selecteaz o nou culoare a fondului textului textcolor : selecteaz o nou culoare a caracterului

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6

Declaraii: Parametru newattr Exemplu:

void textattr(int newattr); void textbackground(int newcolor); void textcolor(int newcolor); Semnificatie Informaiile culorilor codate textcolor(CYAN + BLINK);

COLORS: COLORS enumerare Constant Valoare Utilizat ca fond Constant Valoare Utilizat ca fond BLACK 0 Da DARKGRAY 8 Nu BLUE 1 Da LIGHTBLUE 9 Nu GREEN 2 Da LIGHTGREEN 10 Nu CYAN 3 Da LIGHTCYAN 11 Nu RED 4 Da LIGHTRED 12 Nu MAGENTA 5 Da LIGHTMAGENTA 13 Nu BROWN 6 Da YELLOW 14 Nu LIGHTGRAY 7 Da WHITE 15 Nu BLINK 128 Nu *** *** Pentru a afia caractere intermitent n mod text, trebuie adunat BLINK la culoarea fondului. 6.4.4. Utilizarea modului text window : Definete fereastra activ n mod text

Declaraie: void window(int left, int top, int right, int bottom);
wherex : returneaz poziia curent pe orizontal a cursorului n fereastra text curent wherey : returneaz poziia curent pe vertical a cursorului n fereastra text curent

Declaraii:

int wherex(void); int wherey(void);

gotoxy : Poziioneaz cursorul n fereastra text

Declaraie: void gotoxy(int x, int y);


gettext : copiaz un text de pe ecran n mod text n memorie puttext : copiaz un text din memorie pe ecran n mod text

Declaraii:

int gettext(int left, int top, int right, int bottom, void*destin); int puttext(int left, int top, int right, int bottom, void*source);

Observaii: gettext memoreaz coninutul ecranului din dreptunghiul definit de (left, top) i (right, bottom) n zona de memorie *destin. puttext scrie coninutul zonei de memorie *source pe ecran.

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6 gettextinfo : Obine informaiile modului text Declaraie: void gettextinfo(struct text_info *r); struct text_info { unsigned char winleft; /* coordonata din stnga a ferestrei */ unsigned char wintop; /* coordonata de sus a ferestrei */ unsigned char winright; /* coordonata din dreapta a ferestrei */ unsigned char winbottom; /* coordonata de jos a ferestrei */ unsigned char attribute; /* atributele textului */ unsigned char normattr; /* atributele normale */ unsigned char currmode; /* modul video curent: BW40, BW80, C40, C80, or C4350 */ unsigned char screenheight; /* nlimea textului */ unsigned char screenwidth; /* limea textului */ unsigned char curx; /* coordonata x n fereastra curent */ unsigned char cury; /* coordonata z n fereastra curent */ };

6.5. Exemple de programe


{DETECTGR.C - Detectarea drive-ului si modului grafic} #include #include #include #include <graphics.h> <stdlib.h> <stdio.h> <conio.h>

/* numele diferitelor placi video suportate */ char *dname[] = { "autodetectat", "CGA", "MCGA", "EGA", "64K EGA", "EGA monocrom", "IBM 8514", "Hercules monocrom", "AT&T 6300 PC", "VGA", "IBM 3270 PC" void main(void) { /* returneaza informatia privind hardware-ul detectat */ int gdriver, gmode, errorcode; /* detecteaza hardware-ul grafic disponibil */ detectgraph(&gdriver, &gmode); /* citeste rezultatul apelului detectgraph */ errorcode = graphresult(); if (errorcode != grOk) /* a aparut o eroare */ { printf("Eroare grafica : %s\n", grapherrormsg(errorcode)); printf(":"); getch(); exit(1); /* terminat cu cod de eroare */ } /* afiseaza informatia detectata */ clrscr(); printf("Aveti o placa video %s.\n", dname[gdriver]); printf("Apasati orice tasta pentru oprire:"); getch(); } {GETIMAGE.C - Salveaza si reface continutul ecranului grafic} #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <alloc.h> int maxx, maxy;

};

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6


void save_screen(void far *buf[4]) { unsigned size; int ystart=0, yend, yincr, block; yincr = (maxy+1) / 4; yend = yincr; size = imagesize(0, ystart, maxx, yend); /* obtine dimensiunea in octeti a imaginii */ for (block=0; block<=3; block++) { if ((buf[block] = farmalloc(size)) == NULL) { closegraph(); printf("Eroare: nu este destul spatiu heap.\n"); exit(1); } getimage(0, ystart, maxx, yend, buf[block]); ystart = yend + 1; yend += yincr + 1; } } void restore_screen(void far *buf[4]) { int ystart=0, yend, yincr, block; yincr = (maxy+1) / 4; yend = yincr; for (block=0; block<=3; block++) { putimage(0, ystart, buf[block], COPY_PUT); farfree(buf[block]); ystart = yend + 1; yend += yincr + 1; } } void main(void) { int gdriver=DETECT, gmode, errorcode; void far *ptr[4]; initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi"); errorcode = graphresult(); if (errorcode != grOk) { printf("Eroare grafica: %s\n", grapherrormsg(errorcode)); printf("Apasati orice tasta pentru oprire:"); getch(); exit(1); } maxx = getmaxx(); maxy = getmaxy(); /* deseneaza o imagine pe ecran */ rectangle(0, 0, maxx, maxy); line(0, 0, maxx, maxy); line(0, maxy, maxx, 0); save_screen(ptr); /* salveaza ecranul curent */ getch(); /* pauza */ cleardevice(); /* clear screen */ getch(); /* pauza */ restore_screen(ptr); /* restore the screen */ getch(); /* pauza */ closegraph(); } {IMAGSIZE.C - Salveaza si reface continutul ecranului grafic} #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #define ARROW_SIZE 10 void draw_arrow(int x, int y)

10

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6


{ /* deseneaza o sageata pe ecran */ moveto(x, y); linerel(4*ARROW_SIZE, 0); linerel(-2*ARROW_SIZE, -1*ARROW_SIZE); linerel(0, 2*ARROW_SIZE); linerel(2*ARROW_SIZE, -1*ARROW_SIZE); } void main(void) { int gdriver = DETECT, gmode, errorcode; void *arrow; int x, y, maxx; unsigned int size; initgraph(&gdriver, &gmode, "c:\\bc31\\bgi"); errorcode = graphresult(); if (errorcode != grOk) /* a aparut o eroare */ { printf("Eroare grafica: %s\n", grapherrormsg(errorcode)); printf("Apasa o tasta pentru oprire:"); getch(); exit(1); /* terminare cu un cod de eroare */ } maxx = getmaxx(); x = 0; y = getmaxy() / 2; /* deseneaza sageata */ draw_arrow(x, y); /* calculeaza dimensiunea imaginii */ size = imagesize(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE); /* aloca memorie pentru a stoca imaginea */ arrow = malloc(size); /* copiaza sageata */ getimage(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE, arrow); /* repeta pana cand o tasta e apasata */ while (!kbhit()) { /* sterge vechea sageata */ delay(10); putimage(x, y-ARROW_SIZE, arrow, XOR_PUT); x += ARROW_SIZE; if (x >= maxx) x = 0; /* afiseaza noua sageata */ putimage(x, y-ARROW_SIZE, arrow, XOR_PUT); } /* elibereaza memoria */ free(arrow); closegraph(); } {SETPAGE.C - Schimba pagina grafica activa si pagina grafica vizibila} #include #include #include #include <graphics.h> <stdlib.h> <stdio.h> <conio.h>

void main(void) { /* selecteaza un driver si un mode care suporta pagini multiple */ int gdriver = EGA, gmode = EGAHI, errorcode; int x, y, ht; initgraph(&gdriver, &gmode, "c:\\bc31\\bgi\\"); errorcode = graphresult(); if (errorcode != grOk) { printf("Eroare grafica: %s\n", grapherrormsg(errorcode)); printf("Apasa orice tasta pentru oprire:");

11

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6


getch(); exit(1); } x = getmaxx() / 2; y = getmaxy() / 2; ht = textheight("W"); /* selecteaza pagina invizibila pentru desenare (nr. 1) */ setactivepage(1); /* deseneaza o linie in pagina nr. 1 */ line(0, 0, getmaxx(), getmaxy()); /* scrie un mesaj in pagina nr. 1 */ settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(x, y, "Aceasta este pagina nr. 1:"); outtextxy(x, y+ht, "Apasa orice tasta pentru oprire:"); /* selecteaza desenare in pagina nr. 0 */ setactivepage(0); /* scrie un mesaj in pagina nr. 0 */ outtextxy(x, y, "Aceasta este pagina nr. 0."); outtextxy(x, y+ht, "Apasa orice tasta pentru a vedea pagina nr. 1:"); getch(); /* selecteaza pagina nr. 1 ca pagina visibila */ setvisualpage(1); getch(); closegraph(); } {TEXTATTR.C - Modifica atributele textului} #include <conio.h> void main(void) { int i,j; for (i=0; i<8; i++) { for (j=0; j<8; j++) { textattr(i + (j << 4)); clrscr(); cprintf("Acesta este un test\r\n"); getch(); } } clrscr(); } {TEXTINFO.C - Obtine informatii despre modul text curent} #include <conio.h> int main(void) { struct text_info ti; gettextinfo(&ti); clrscr(); cprintf("stanga cprintf("sus cprintf("dreapta cprintf("jos cprintf("atribut cprintf("mod curent cprintf("inaltime cprintf("latime cprintf("x curent cprintf("y curent getch(); }

%2d\r\n",ti.winleft); %2d\r\n",ti.wintop); %2d\r\n",ti.winright); %2d\r\n",ti.winbottom); %2d\r\n",ti.attribute); %2d\r\n",ti.currmode); %2d\r\n",ti.screenheight); %2d\r\n",ti.screenwidth); %2d\r\n",ti.curx); %2d\r\n",ti.cury);

{WINDOWS0.C - Creeaza si utilizeaza o fereastra in mod text}

12

ARHITECTURA SISTEMELOR DE CALCUL LUCRAREA DE LABORATOR NR. 6


#include <conio.h> int i,j,a,b,l,c; char ch; struct text_info ti; void fereastra(int li, int co, int st, int su) { // desenare chenar window(st,su,st+co,su+li); textcolor(BLACK);textbackground(WHITE); cprintf(""); for (i=0; i<co-1; i++) cprintf(""); cprintf(""); for (j=0; j<li-2; j++) { cprintf(""); for (i=0; i<co-1; i++) cprintf(" "); cprintf(""); } cprintf(""); for (i=0; i<co-1; i++) cprintf(""); cprintf(""); // stergere continut window(st+1,su+1,st+co-1,su+li-2); textcolor(WHITE);textbackground(BLACK); clrscr(); } void main(void) { // salvarea dimensiunilor ferestrei curente gettextinfo(&ti); // citirea parametrilor noii ferestre cprintf("Introduceti numarul de linii (min 3) "); scanf("%d", &l); // nr. linii cprintf("Introduceti numarul de coloane (min 3) "); scanf("%d", &c); // nr. coloane cprintf("Introduceti coordonata x stanga "); scanf("%d", &a); // coloana stanga cprintf("Introduceti coordonata y sus "); scanf("%d", &b); // linie sus clrscr(); fereastra(l,c,a,b); // crearea noii ferestre while ((ch != '.')) { ch = getch(); putch(ch); } delay(500); // refacerea ferestrei initiale window(ti.winleft,ti.wintop,ti.winright,ti.winbottom); clrscr(); }

6.6. Desfurarea lucrrii


a) S se modurile de lucru cu monitorul video. b) S se studieze exemplele de la punctul 6.4. S se verifice corectitudinea funcionrii programelor. c) S se studieze programul demostartiv BGIDEMO.C din kit-ul de instalare Borland C ++.

13