Pagina de start a forumului Hacking4all.MyForum.ro
Inregistrare • Cautare • FAQ • Membri • Grupuri • Autentificare
Utilizarea ncurses

 
Raspunde la subiect    Pagina de start a forumului Hacking4all.MyForum.ro » Programare / Scripting Subiectul anterior
Subiectul urmator
Utilizarea ncurses
Autor Mesaj
OvaS
Administrator
Administrator


Data inscrierii: 29/Aug/2007
Mesaje: 68
Localitate: Calarasi

Mesaj Folosirea ncurses Raspunde cu citat (quote)
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 !
30/08/2007 12:46 Vezi profilul utilizatorului Trimite mesaj privat
Afiseaza mesajele pentru a le previzualiza:    
Raspunde la subiect    Pagina de start a forumului Hacking4all.MyForum.ro » Programare / Scripting Ora este GMT + 3 ore
Pagina 1 din 1

 
Mergi direct la: 
Nu puteti crea un subiect nou in acest forum
Nu puteti raspunde in subiectele acestui forum
Nu puteti modifica mesajele proprii din acest forum
Nu puteti sterge mesajele proprii din acest forum
Nu puteti vota in chestionarele din acest forum


Powered by phpBB © 2001, 2005 phpBB Group
Fa-ti si tu propriul forum GRATUIT, pe www.myforum.ro