14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL...

10
1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter este reprezentat pe doi octeti: codul ASCII si atributul caracterului: -bit 7: blinking (1 activ, 0 inactiv); -bitii 6-4: culoare fond; -bitii 3-0: culoare caracter. Functiile sunt declarate in conio.h. void textmode (int mod); stabileste modul de lucru: BW40 0 C40 1 BW80 2 C80 3 . . . . . . . . . Exemplu: textmode(BW40); textmode(3); Functii pentru citire / scriere text Afisarea se face in fereastra activa (initial intregul ecran), daca se ajunge la marginea din dreapta, se continua in stanga pe randul urmator. int cscanf (char * sir_format [, lista_adr_var]); citeste de la consola, cu formatarea datelor (citeste de la consola, in timp ce scanf citeste de la streamul stdin). Returneaza numarul de valori citite si memorate sau EOF daca se atinge sfarsit de fisier inainte de citirea tuturor variabilelor. int cprintf (const char *sir_format, lista_valori); afiseaza lista de valori in fereastra curenta cu formatarea datelor (diferenta fata de printf: \n nu se converteste automat in \r \n, deci trebuie sa se specifice ambele caractere). Returneaza numarul de valori afisate. char* cgets (char *sir); citeste sirul de caractere pana la \r\n sau numarul maxim de caractere (acest numar se inscrie in sir[0] inainte de apel) si inlocuieste \r\n cu \0. Inscrie in sir[1] numarul efectiv de caratere citite, iar sirul incepe din sir[2] . Rezultatul este adresa sirului, adica sir[2] . int cputs (const char *sir); afiseaza sirul in fereastra curenta (nu adauga automat \r\n) si intoarce ultimul caracter afisat.

Transcript of 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL...

Page 1: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

1

14. AFISAREA PE ECRAN IN MODUL TEXT

Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter este

reprezentat pe doi octeti: codul ASCII si atributul caracterului:

-bit 7: blinking (1 activ, 0 inactiv);

-bitii 6-4: culoare fond;

-bitii 3-0: culoare caracter.

Functiile sunt declarate in conio.h.

void textmode (int mod);

stabileste modul de lucru:

BW40 0

C40 1

BW80 2

C80 3

. . . . . . . . .

Exemplu:

textmode(BW40);

textmode(3);

Functii pentru citire / scriere text

Afisarea se face in fereastra activa (initial intregul ecran), daca se ajunge la marginea din dreapta, se

continua in stanga pe randul urmator.

int cscanf (char * sir_format [, lista_adr_var]);

citeste de la consola, cu formatarea datelor (citeste de la consola, in timp ce scanf citeste de la

streamul stdin). Returneaza numarul de valori citite si memorate sau EOF daca se atinge sfarsit de

fisier inainte de citirea tuturor variabilelor.

int cprintf (const char *sir_format, lista_valori);

afiseaza lista de valori in fereastra curenta cu formatarea datelor (diferenta fata de printf: \n nu se

converteste automat in \r \n, deci trebuie sa se specifice ambele caractere). Returneaza numarul de

valori afisate.

char* cgets (char *sir);

citeste sirul de caractere pana la \r\n sau numarul maxim de caractere (acest numar se inscrie in

sir[0] inainte de apel) si inlocuieste \r\n cu \0. Inscrie in sir[1] numarul efectiv de caratere citite, iar

sirul incepe din sir[2]. Rezultatul este adresa sirului, adica sir[2].

int cputs (const char *sir);

afiseaza sirul in fereastra curenta (nu adauga automat \r\n) si intoarce ultimul caracter afisat.

Page 2: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

2

int getch (void);

int getche (void);

citeste un carcater fara / cu ecou.

int putch (int c );

afiseaza caracterul c si intoarce caracterul sau EOF la eroare.

Functii pentru gestionarea textului pe ecran

int movetext (int x1, int y1, int x2, int y2, int xstg, int ysus);

deplaseaza textul din dreptunghiul (x1,y1) coltul stanga sus si (x2,y2) coltul dreapta jos in noul

dreptunghi avand coltul stanga sus (xstg,ysus). Intoarce ≠0 la succes si =0 la eroare (coordonatele in

afara ecranului).

void gotoxy (int x, int y);

deplaseaza cursorul in pozitia x,y (daca cel putin o coordonata este gresita, nu are efect).

void clrscr (void);

sterge fereastra curenta si pozitioneaza cursorul in pozitia (1,1).

void clreol (void);

sterge caracterele din pozitia curenta pana la sfarsitul liniei, cursorul nu se deplaseaza.

void delline (void);

sterge linia cu cursorul si executa defilare (scroll) pentru liniile urmatoare.

void insline (void);

insereaza o linie libera in pozitia cursorului, liniile urmatoare sunt deplasate in jos.

int gettext (int x1, int y1, int x2, int y2, void *tablou);

copiaza caracterele din dreptunghiul specificat in tablou (numar de octeti = nr_linii * nr_coloane *

2). Rezultatul functiei: ≠0 la succes si =0 la eroare.

int puttext (int x1, int y1, int x2, int y2, void *tablou);

afiseaza continutul tabloului pe ecran, in dreptunghiul specificat. Intoarce ≠0 la succes si =0 la

eroare.

int wherex (void);

int wherey (void);

furnizeaza coordonatele pozitiei curente a cursorului.

Page 3: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

3

Functii pentru fereastra

void window (int x1, int y1, int x2, int y2);

specifica fereastra curenta de afisare prin coordonate absolute. Daca coordonatele sunt in afara

limitelor ecranului curent, functia nu are efect. Ferestrele se pot suprapune. Coordonatele functiilor

de operare cu ecranul sunt relative la fereastra curenta de afisare.

void gettextinfo (struct text_info *p);

citeste setul de parametri intr-o structura text_info (declarata in conio.h):

struct text_info {

unsigned char winleft, wintop, winright, winbottom; //fereastra curenta

unsigned char attribute, normattr; //atrib. crnt, atr. init. al celulelor

unsigned char currmode; //mod curent de afisare

unsigned char screenheight, screenwidth; //inaltime, latime ecran

unsigned char cursx, cursy; //coordonate cursor

};

Functii pentru controlul atributelor

void textcolor (int culoare);

seteaza culoarea caracterelor. Culorile disponibile pentru text si fond:

0 = BLACK

1 = BLUE

2 = GEEN

3 = CYAN

4 = RED

5 = MAGENTA

6 = BROWN

7 = LIGHTGRAY

Culori disponibile numai pentru text:

8 = DARKGRAY

9 = LIGHTBLUE

10 = LIGHTGREEN

11 = LIGHTCYAN

12 = LIGHTRED

13 = LIGHTMAGENTA

14 = YELLOW

15 = WHITE

128 = BLINK

Exemplu: . . . . . . . .

textcolor(YELLOW); //in continuare caracterele se vor afisa cu galben

Page 4: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

4

. . . . . . .

void textbackground (int culoare);

selecteaza culoarea fondului pentru afisarea carcaterelor.

void textattr (int atribut);

specifica atributul fiecarui carcater care urmeaza sa se afiseze.

Exemplu: se poate utiliza operatorul SAU la nivel de bit pentru specificarea atributului.

. . . . . . . . . textattr (BLINK | BLUE*16 | YELLOW); //atribut = 1 001 1110

Exemplu: prima pagina a unui proiect.

#include <conio.h>

#include <dos.h>

#include <string.h>

void main (void) {

char univ[]="UNIVERSITATEA POLITEHNICA BUCURESTI";

char fac[]="FACULTATEA DE STIINTE APLICATE";

char nume[]="IONESCU ADRIAN";

char grupa[]="Grupa 1311";

textmode(C80);

textbackground (BLUE);

clrscr();

//border();

textcolor(YELLOW);

gotoxy(80/2-strlen(univ)/2,3);

cprintf(univ);

gotoxy(80/2-strlen(fac)/2,5);

cprintf(fac);

gotoxy(1,23);

cprintf("Apasati o tasta!");

window(25,10,55,20);

textbackground(RED);

clrscr();

textcolor(WHITE);

gotoxy(30/2-strlen(nume)/2,2);

cprintf(nume);

gotoxy(30/2-strlen(grupa)/2,5);

cprintf(grupa);

sound(1500);

delay(5000);

sound(100);

getch();

nosound();

}

15. AFISAREA PE ECRAN IN MODUL GRAFIC

Functiile de afisare in modul grafic se gasesc in biblioteca graphics.lib si se specifica

includerea fisierului antet graphics.h. Ecranul este vazut sub forma unei matrici de pixeli, de

Page 5: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

5

dimensiuni in functie de rezolutia curenta (exemplu pentru rezolutia 800*600 => matricea are 800

coloane de puncte de la 0 la 799 si 600 linii de la 0 la 599).

Controlul sistemului grafic

Driverele grafice se gasesc intr-un anumit director, de exemplu in C:\BC4|BGI, care trebuie

specificat la initializarea modului grafic de afisare pe ecran.

void far initgraph (int far *gdriver, int far *gmode, char far *cale);

initializeaza modul grafic, unde gdriver este driverul grafic si care poate fi:

DETECT 0

CGA 1

. . . . . . .

VGA 9

. . . . . . .

gmode este modul grafic pentru un adaptor, de exemplu pentru VGA:

VGALO 0 640*200

VGAMED 1 640*350

VGAHI 2 640*480

iar cale este calea de directoare pentru driverul grafic necesar afisarii. Modificatorul far specifica

apeluri de functii si reveniri utilizand variabile care sunt in afara segmentului de date.

Exemplu:

int gdrv=VGA, gmd=VGAHI;

initgraph(&gdrv,&gmd,"\\tc\\bgi"); //in sir '\' trebuie dedublat

void far detectgraph (int far *gdrive, int far *gmode);

detecteaza driverul grafic din calculator si rezolutia maxima.

int far getmaxx (void);

int far getmaxy (void);

furnizeaza rezolutia maxima curenta.

void far setgraphmode (int gmode);

selecteaza alt mod grafic pentru driverul instalat, sterge ecranul si reinitializeaza parametrii

sistemului grafic.

void far restorecrtmode (void);

reface modul video precedent, permite comutarea intre text si grafic.

void far closegraph (void);

inchide modul grafic.

int far graphresult (void);

Page 6: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

6

furnizeaza codul erorii la o operatie grafica.

Culori

Numarul de culori disponibile este in functie de interfata grafica. De exemplu pentru VGA: 16

culori.

int far getmaxcolor (void);

intoarce codul culorii cu valoarea maxima din paleta.

void far setcolor (int culoare);

stabileste culoarea curenta de desenare.

Exemplu: setcolor (LIGHTBLUE);

int far getcolor (void);

intoarce culoarea curenta de trasare.

void far setbkcolor (int culoare);

int far getbkcolor (void);

analog pentru fond.

unsigned far getpixel (int x, int y);

preia valoarea unui pixel (culoare).

void far putpixel (int x, int y, int culoare);

plaseaza un pixel pe ecran avand o anumita culoare.

Desenare

Coordonatele functiilor de desenare sunt relative la fereastra curenta (initial intregul ecran).

int far getx (void);

int far gety (void);

furnizeaza pozitia curenta pe ecran.

void far moveto (int x, int y);

deplaseaza indicatorul pozitiei curente in punctul (x,y).

Page 7: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

7

void far moverel (int dx, int dy);

deplasare relativa pe ecran.

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);

traseaza o linie pe ecran.

void far circle (int x, int y, int raza);

traseaza un cerc.

void far arc (int x, int y, int unghi_init, int unghi_fin, int raza);

traseaza un arc de cerc.

void far ellipse (int x, int y, int unghi_init, int unghi_fin, int saxax, int saxay);

traseaza un arc de elipsa.

void far rectangle (int x1, int y1, int x2, int y2);

traseaza un dreptunghi.

void far drawpoly (int nr_puncte, int far *coord_puncte);

traseaza o polinie (secventa de segmente).

Ferestre

void far cleardevice (void);

sterge intregul ecran si muta indicatorul pozitiei curente in (0,0).

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

creaza o fereastra in care se va desfasura in continuare aplicatia grafica. Daca clip ≠0 trunchiaza

ceea ce depaseste limitele ferestrei, iar pentru clip=0 desenul poate depasi fereastra. Coltul stanga

sus al ferestrei devine origine (0,0).

void far clearviewport (void);

sterge fereastra curenta si muta indicatorul in origine.

unsigned far imagesize (int x1, int y1, int x2, int y2);

calculeaza dimensiunea zonei de memorie necesara ferestrei de imagine. Daca imaginea este mai

mare decat 64K - 1 octeti, imagesize returneaza 0xFFFF (-1).

Page 8: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

8

void far getimage (int x1, int y1, int x2, int y2, void far *buffer):

memoreaza imaginea din fereastra in buffer.

void far putimage (int x1, int y1, void far *buffer, int operator):

copiaza imaginea din buffer pe ecran in fereastra avand coltul stanga sus (x1,y1), folosind

operatorul:

COPY_PUT 0 copiere simpla

XOR_PUT 1 sau-ex

OR_PUT 2 sau

AND_PUT 3 SI

NOT_PUT 4 inversare

Afisare text

void far outtext (char far *text);

afiseaza textul incepand din pozitia curenta.

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

afiseaza textul incepand din pozitia (x,y).

Exemplu: graficul functiei sinus pe intervalul [-π, π]. O problema importanta este

translatarea ferestrei aplicatiei (care utilizeaza coordonate ale aplicatiei) in fereastra ecran (utilizand

coordonate ecran).

0 maxx

0

fereastra

ecran

(gx,gy)

maxy

-π π

1

fereastra

aplicatiei

(x,y)

-1

Relatiile utilizate sunt:

Page 9: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

9

-coordonata gx:

maxx.............................................2π

gx.................................................x-(-π)

=> π

π

2

)( maxxxgx

⋅+=

-coordonata gy:

maxy............................................2

gy..................................................1-y

=> 2

)1( maxyygy

⋅−=

#include <graphics.h>

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <math.h>

#define PI 3.1415

int main(void)

{

/* autodetectarea interfetei grafice */

int gdriver=DETECT, gmode, errorcode;

int n,i,maxx,maxy,gx,gy;

float x,y;

cout<<"Introduceti nr puncte reprezentare sinus:"; //iostream.h

cin>>n; //iostream.h

/* initializare grafica si variabile locale */

initgraph(&gdriver, &gmode, "");

/* rezultatul initializarii */

errorcode = graphresult();

if (errorcode != grOk) /* cod eroare */

{

cout<<"Eroare grafica: \n"<<grapherrormsg(errorcode);

cout<<"Apasati orice tasta pentru oprire:";

getch(); //conio.h

exit(1); /* incheiere cu un cod de eroare - stdlib.h*/

}

setcolor(getmaxcolor());

maxx=getmaxx(); maxy=getmaxy();

line(0,0,maxx,0); line(maxx,0,maxx,maxy);

line(maxx,maxy,0,maxy); line(0,maxy,0,0);

line(0,maxy/2,maxx,maxy/2);

line(maxx/2,0,maxx/2,maxy);

setcolor(getmaxcolor()-1);

Page 10: 14. AFISAREA PE ECRAN IN MODUL TEXT - Grupa 1312 · PDF file1 14. AFISAREA PE ECRAN IN MODUL TEXT Ecranul este vazut ca o matrice de 80 coloane x 25 linii de caractere. Fiecare caracter

10

moveto(0,maxy/2);

x=-PI;

for(i=1;i<=n;i++) {

x+=2*PI/n; y=sin(x); //math.h

gx=(int)(maxx*(PI+x)/2/PI);

gy=(int)((1-y)*maxy/2);

lineto(gx,gy);

}

/* incheiere mod grafic */

getch();

closegraph();

return 0;

}