OvaS
Administrator

Data inscrierii: 29/Aug/2007 Mesaje: 68 Localitate: Calarasi |
|
Folosirea ncurses |
|
Ce reprezinta acest concept ncurses ?
NCURSES este o librarie de functii , prin intermediul carora se pot crea ferestre , crea/utiliza nuanțe , juca cu mousul.Practic , acesta ofera un framework pentru creerea unor interfete ( colorate ) in modul text .Aceasta librarie , vine la colet cu sistemul de operare ( Linux ) .
In randurile ce urmeaza , explicat si exemplificat ( practic ) , voi incerca a prezenta frumusetea simplitudinii ncurses.
Ca exemplu voi alege , tipicul "Hello World" . Adica , voi prezenta mai jos codul sursa al unui program minimal ( in C , folosind libraria de functii ncurses ) , care va afisa Hello World .
Code:
#include <ncurses.h>
int main()
{
initscr();
printw("Hello World !");
refresh();
endwin();
return 0;
}
Un exemplu simplu , pentru viitoare "programe" complexe.Repet , mini-programul de mai sus afiseaza pe ecran "Hello World" si se termina.
Cum face acest fapt , voi explica mai jos.
Dupa cum puteti vedea pe întâia linia a programului , trebuie adăugat ncurses.h pentru a putea folosi functiile din libraria aferenta.
De întocmai , trebuie remarcat , ca la compilarea unui astfel de program , trebuie legat programul cu libraria ncurses , ex :
Code:
gcc -o < program name > hello.c -lncurses
* initscr(); : Se porneste modul curses , alocandu-se memorie pentru fereastra default stdscr .
* printw("Hello World !"; : Similiar printf el afiseaza pe fereastra default ( stdscr ) , de care am mentionat mai devreme , mesajul : "Hello World " .Nefiind specificate cordonatele afisari , va fi "printat" , la coordonatele (0,0) in fereastra principala.
P.S. : Pentru a nu aparea dubii mai tarziu : Aceasta functie nu afiseaza pe ecran ( fereastra ) , ci trimite datele de afisat intr-un "loc" in memorie , pentru o viitoare afisare.
* refresh(); : Dupa cum mentionasem putin mai sus , printw nu afiseaza pe ecranul fizic , refresh() avand rolul sa actualizeze ecranul fizic cu datele din acel "loc" din memorie numit buffer , unde le aseaza printw() ( pentru o viitoare actualizare ).
* endwin(); : Se termina modul curses.
Ai perfecta dreptate , pana acum , nu am facut nimic nou. Puteam afisa pe ecran "Hello World", fara libraria de functii ncurses .Deci sa trecem mai departe.
Functii aferente
* noecho/echo : Atunci cand introducem caractere , astea sunt afisate pe ecran in timpul introducerii.Daca din diferite cauze nu dorim afisarea acestora in momentul introducerii , apelam functia noecho() .
* raw() : dezactiveaza line buffer , este de preferabil de întrebuințat , pe langa alte functii gen cbreak()
* keypad() : este o functie foarte folosita pentru programele "moderne". Aceasta îngăduie folosirea tastelor : sageti , F1 , F2 , F3 , cat si a altor taste.
Functii de iesire
*printw/mvprintw : sunt functii similare printf , dar mvprintw are avantajul ca se poate muta intai cursorul la o pozitie stabilita ( de doua coordonate ) , apoi afisa . printw afiseaza pe ecran , unde a ramas cursul , daca totusi dorim sa folosim printw dar totusi sa afisam la un anumit loc din ecran , folosim intai functia move() apoi printw .mvprintw , are inclusa functia move , deci face doua lucruri odata.Mai economic , nu altceva .
* wprintw/mvwprintw : functiile de mai sus , afiseaza in fereastra standard stdsrc .Daca totusi creem o fereastra noua ( vom invata mai tarziu ) , si dorim sa afisam ceva in interiorul acelei ferestre , folosim functiile cu un w la inceput ( desigur + un parametru suplimentar , care pointeaza catre fereastra.Voi exemplifa mai tarziu.
Functii de intrare
* getch() : citeste un solitar caracter de la tastatura
*scanw/mvscanw : similar scanf , dar asemanator structurat cu "mvprintw" si "printw" citeste un sir de caractere de la tastatura.
Atribute
* attron/attroff : Aceste doua functii primesc un atribut si il activeaza sau dezactiveaza.Pot primi de exemplu atribul de scris ingrosat , apoi sa fie ignorat scrisul ingrosat .
Code:
attron(A_BOLD) vs attroff(A_BOLD)
-Alte atribute , pe care le putem activa / dezactiva prin aceste atribute sunt : ( desigur sunt mai numeroase ).
*A_REVERSE
*A_BLINK
*A_UNDERLINE
* wattron/wattron : face exact acelasi lucru ca functiile doua de mai sus , doar intr-o fereastra ( + un parametru secundar , semnificand fereastra .
Exemplu : ( Mai jos voi prezenta un cod sursa , care afiseaza pe ecranul default ( stdscr ) , mesajul "Hello World" ingrosat , la pozitia ( 2,4 ).
Code:
#include <ncurses.h>
int main()
{
initscr();
raw(); /* disable line buffer */
attron(A_BOLD);
mvprintw(2,4,"Hello World !!!");
refresh();
atrroff(A_BOLD);
endwin();
return 0;
}
Tot am discutat de functii de intrare / iesire in ferestre , dar nu am prezentat cum se creaza o fereastra :
Un concept important , ca de aceea folosim ncurses , este reprezentat de ferestre.Ce rol au ? In loc sa folosim , tot ecranul default ( fereastra stdscr ) , folosim mai multe ferestre , si modificam parti din ecran ( de care avem nevoie , adica ferestre ) dupa bunul plac.Vrem estetică , folosim ferestre.
Code:
newwin() / delwin()
Functiile de mai sus creaza respectiv sterg o ferestra.Aloca , respectiv dealoca memoria pentru respectiva fereastra . Nu afiseaca nimic, decat aloca memorie structurii ferestrei.
Code:
box(win,0,0)
Functia box() , reda marginile ferestrei , pentru a putea fi identificata vizual/fizic pe ecran.Are trei parametri.Primul pointeaza catre ferestra ( win ) , si ceilalti doi senifica ce semne va avea fereastra pe laterale. (0,0) , inseamna default , daca dorim ca pe laterale ( nu si colturi sa avem ceva de genu "$" , folosim urmatorul algoritm , rudimentar :
Code:
box(win,'$','$');
Daca dorim , controlul complet asupra marginilor si colturilor ferestrei create folosim urmatoare functie .
Code:
wborder(win, '', '', '', '', '', '', '', '');
Prin intermediul acesteia , putem controla ce apare la colturile ferestrei + marginile acesteia.
Exemplu , mai jos un cod sursa , pentru initializarea unei ferestre si conturarea acesteia + afisarea in interiorul ferestrei la (10,10) a mesajului "Hello World" , ingrosat
Code:
#include <ncurses.h>
int main()
{
WINDOW *win;
int startx, starty, width, height;
int ch;
initscr();
cbreak();
keypad(stdscr, TRUE);
height = 15; width = 25;
starty = (LINES - height) / 2;
startx = (COLS - width) / 2;
refresh();
win = newwin(height, width, starty, startx);
box(win, 0 , 0); wrefresh(win);
wattron(win,A_BOLD);
mvwprintw(win,10,10," Hello World");wrefresh(win);
wattroff(win,A_BOLD);
getch();
endwin();
delwin(win);
return 0;
}
P.S. : am folosit COLS & LINES , initializate default cu dimensiunile ecranului dupa stdscr .
O functie "importanta" este :
* : getmaxyx(stdscr,a,bl); , afla dimensiunile (a,b) ale ecranului principal ( stdscr ).
Sa discutam , si despre culori , si terminam . Aceasta librarie de functii ncurses se ocupa extraordinar de frumos de culori.
Code:
start_color()
Functia de mai sus , iti acorda dreptul sa folosesti culorile.Ca sa folosim culorile , intai le declaram ( tentă fundal + colorație font ) , apoi cu susținerea atributelor le activam / dezactivam.
Code:
init_pair(1,COLOR_RED,COLOR_BLACK);
wattron(win,COLOR_PAIR(1));
Dupa cum va puteti da seama , init_pair , initializeaza culorile , care vor fi utilizate , numarul 1 semnifica nuanță rosu pe font negru. si wattron , activeaza atributul 1 , pentru fereastra win ( declarata anterior ).
Pentru o mai buna intelegere a acestui fenomen ncurses , creare ferestre , colorații si multe altele prezentate mai sus , voi prezenta codul sursa al programului ( C + ncurses ) , dupa care mi-am creat semnatura. ( Doar ca acum va afisa pe doua culori : Lectia 12 : Utilizarea ncurses .Desigur , ca am folosit si alte cateva trucuri pentru stil si marirea vitezei de miscare a literelor ( C , imi implementa doar sleep(1) )
Code:
#include <ncurses.h>
int main()
{
WINDOW *win;
int startx, starty, width, height;
char s[]="Lectia 12 : Utilizarea ncurses";
initscr(); cbreak(); keypad(stdscr, TRUE);
height = 30; width = 60;
starty = (LINES - height) / 2;
startx = (COLS - width) / 2;
refresh();
win = newwin(height, width, starty, startx);wrefresh(win);
start_color();
init_pair(2,COLOR_GREEN,COLOR_BLACK);
init_pair(1,COLOR_RED,COLOR_BLACK);
wattron(win,A_BOLD);
wattron(win,COLOR_PAIR(1));
int i;
for (i=0;i<strlen(s);++i)
{ mvwprintw(win,10,10+i,"%c",s[i]);
sleep(1);wrefresh(win);
}
wattroff(win,COLOR_PAIR(1));
wattron(win,COLOR_PAIR(2));
for (i=0;i<strlen(s);++i)
{ mvwprintw(win,10,10+i,"%c",s[i]);
sleep(1);
wrefresh(win);}
wattroff(win,COLOR_PAIR(2));
endwin();
return 0;
}
Have FUN !! Voi reveni cu explicatii aferente !
|
|