Programowanie z ncurses (index)


Programowanie z ncurses (2) - procedury wyjściowe

ZADANIE 2.1

W katalogu domowym utworzyć podkatalog znaki. Utworzyć w nim pliki Makefile i znaki.c postaci:


/*
*  znaki.c
*
*  Prezentacja wyjścia znakowego.
*/

#include <unistd.h>  /* sleep() */
#include <curses.h>

int main(void) 
{
initscr();
printw("To sa ramki rysowane znak po znaku\n");

mvaddch(5,10,ACS_ULCORNER); /* gorny lewy rog  */
addch(ACS_HLINE);    /* linia pozioma */
addch(ACS_TTEE);    /* T w dol */
addch(ACS_HLINE);    /* linia pozioma */
addch(ACS_URCORNER); /* gorny prawy rog  */

mvaddch(6,10,ACS_VLINE);    /* linia pionowa */
addch('A' | A_REVERSE);    /* zwykly znak */
addch(ACS_VLINE);    /* linia pionowa */
addch('B' | A_BOLD);    /* zwykly znak */
addch(ACS_VLINE);    /* linia pionowa */

mvaddch(7,10,ACS_LTEE);    /* T w prawo */
addch(ACS_HLINE);    /* linia pozioma */
addch(ACS_PLUS);    /* duzy + */
addch(ACS_HLINE);    /* linia pozioma */
addch(ACS_RTEE);    /* T w lewo */

mvaddch(8,10,ACS_VLINE);    /* linia pionowa */
addch('C' | A_DIM);    /* zwykly znak */
addch(ACS_VLINE);    /* linia pionowa */
addch('D' | A_BLINK);    /* zwykly znak */
addch(ACS_VLINE);    /* linia pionowa */

mvaddch(9,10,ACS_LLCORNER); /* dolny lewy rog  */
addch(ACS_HLINE);    /* linia pozioma */
addch(ACS_BTEE);    /* T w gore */
addch(ACS_HLINE);    /* linia pozioma */
addch(ACS_LRCORNER); /* dolny prawy rog  */
refresh();
sleep(2);

/* tu jawnie odnosimy sie do stdscr */
wattron(stdscr,A_BOLD);
mvwaddch(stdscr,13,5,'1'); /* */
waddch(stdscr,'2'); /* */
waddch(stdscr,'3'); /* */
waddch(stdscr,'4'); /* */
waddch(stdscr,'5'); /* */
wattroff(stdscr,A_BOLD);
mvwinsch(stdscr,13,7,'a'); /* rozpychanie znakow */
winsch(stdscr,'b'); /* rozpychanie znakow */
winsch(stdscr,'c'); /* rozpychanie znakow */
mvwprintw(stdscr,20,5,"Koniec pracy\n");
wrefresh(stdscr);
sleep(2);

endwin();
return 0;
}

Skompilować i uruchomić program. Dodać nowe elementy wyświetlane przez program wg własnego uznania.

ZADANIE 2.2

W katalogu domowym utworzyć podkatalog napisy. Utworzyć w nim pliki Makefile i napisy.c postaci:


/*
*  napisy.c
*
*  Prezentacja wyjścia łańcuchowego.
*/

#include <unistd.h>   /* sleep() */
#include <curses.h>

int main(void) 
{
int xmax, ymax;

initscr();        /* mozna sprawdzic */
getmaxyx(stdscr, ymax, xmax);
/* box(stdscr,ACS_VLINE,ACS_HLINE); ramka na cale okno */
box(stdscr,0,0); /* ramka na cale okno - prosciej */
mvaddstr(2, 5, "Korzystam z funkcji typu *str(), linii, ramek...");
mvaddstr(3, 1, "Ramka rysowana przez box()");
mvaddstr(4, 1, "Ten napis bedzie caly");
mvaddnstr(5, 1, "Ten napis bedzie uciety", 13);

/* mvhline(7,5,ACS_HLINE,xmax/2); krotka linia pozioma */
mvhline(7,5,0,xmax/2); /* krotka linia pozioma - prosciej */

/* mvvline(6,2,ACS_VLINE,ymax/4);  krotka linia pionowa */
mvvline(6,2,0,ymax/4);  /* krotka linia pionowa - prosciej */

refresh();
sleep(2);
erase();
/* mozna inaczej:
clear();
*/
border(ACS_VLINE | A_BOLD, ACS_VLINE | A_BOLD,
ACS_HLINE | A_BOLD, ACS_HLINE | A_BOLD,
ACS_ULCORNER | A_BOLD, ACS_URCORNER | A_BOLD,
ACS_LLCORNER | A_BOLD, ACS_LRCORNER | A_BOLD);
/* prostrza wersja bez atrybutow
border(0,0,0,0,0,0,0,0);
wersja dla ubogich
border('|','|','-','-','+','+','+','+');
*/
mvprintw(ymax/4,xmax/4,"Ramka rysowana przez border()");
refresh();
sleep(2);

endwin();
return 0;
}

Skompilować i uruchomić program. Dodać nowe elementy wyświetlane przez program wg własnego uznania.

FUNKCJE


int move(int y, int x);  // odnosi sie do stdscr
int wmove(WINDOW *win, int y, int x); 

int addch(chtype ch);   // deklaracja, podstawowa funkcja
int waddch(WINDOW *win, chtype ch); // deklaracja
int mvaddch(int y, int x, chtype ch);  // deklaracja
int mvwaddch(WINDOW *win, int y, int x, chtype ch); // deklaracja
addch(ch | A_BOLD | A_UNDERLINE);   // zastosowanie - atrybuty
addch(ACS_HLINE);               // zastosowanie - semigrafika

// te cztery "rozpychają" znaki istniejące na ekranie
int insch(chtype ch);
int winsch(WINDOW *win, chtype ch);
int mvinsch(int y, int x, chtype ch);
int mvwinsch(WINDOW *win, int y, int x, chtype ch);

int echochar(chtype ch);   // deklaracja, addchar+refresh
int wechochar(WINDOW *win, chtype ch); // deklaracja, waddchar+wrefresh

// Wyjście łańcuchowe - łańcuchy pseudoznaków
int addchstr(const chtype *chstr); 
int addchnstr(const chtype *chstr, int n); 
int waddchstr(WINDOW *win, const chtype *chstr); 
int waddchnstr(WINDOW *win, const chtype *chstr, int n); 
// jeszcze cztery z mv na poczatku
int mvaddchstr(int y, int x, const chtype *chstr); 
int mvaddchnstr(int y, int x, const chtype *chstr, int n); 
int mvwaddchstr(WINDOW *win, int y, int x, const chtype *chstr); 
int mvwaddchnstr(WINDOW *win, int y, int x, const chtype *chstr, int n); 

// Wyjście łańcuchowe - łańcuchy zwykłe
int addstr(const char *str);
int addnstr(const char *str, int n);
int waddstr(WINDOW *win, const char *str);
int waddnstr(WINDOW *win, const char *str, int n);
// jeszcze cztery z mv na poczatku
int mvaddstr(int y, int x, const char *str);
int mvaddnstr(int y, int x, const char *str, int n);
int mvwaddstr(WINDOW *win, int y, int x, const char *str);
int mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n);

// Wyjście łańcuchowe - chyba działa jak printf()
int printw(char *str, ...);
int wprintw(WINDOW *win, char *str, ...);
int mvprintw(int y, int x, char *str, ...);
int mvwprintw(WINDOW *win, int y, int x, char *str, ...);

// ramka wokół okna
int box(WINDOW *win, chtype verch, chtype horch); // deklaracja
box(stdscr, ACS_VLINE, ACS_HLINE); // zastosowanie do stdscr
box(stdscr, 0, 0);            // zastosowanie do stdscr

// left-side, right-side, top-side, bottom-side, top-left,...
int border(chtype ls, chtype rs, chtype ts, chtype bs, 
chtype tl, chtype tr, chtype bl, chtype br);

int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, 
chtype tl, chtype tr, chtype bl, chtype br);

// linie
int hline(chtype ch, int n);
int vline(chtype ch, int n);
int whline(WINDOW *win, chtype ch, int n);
int wvline(WINDOW *win, chtype ch, int n);
// jeszcze cztery z mv na poczatku
int mvhline(int y, int x, chtype ch, int n);
int mvvline(int y, int x, chtype ch, int n);
int mvwhline(WINDOW *win, int y, int x, chtype ch, int n);
int mvwvline(WINDOW *win, int y, int x, chtype ch, int n);

// Funkcje czyszczące
int erase(void); // wypisuje puste znaki na całym ekranie
int werase(WINDOW *win);
int clear(void);
int wclear(WINDOW *win);
int clrtobot(void);  // czyszczenie od kursora do dołu
int clrtobot(WINDOW *win);
int clrtoeol(void);  // czyszczenie od kursora do końca linii
int clrtoeol(WINDOW *win);

// Częściowa lista atrybutów znaków
A_NORMAL     // tryb normalny
A_STANDOUT   // użyj najlepszego trybu podświetlania terminala
A_UNDERLINE  // podkreślenie
A_REVERSE   // w negatywie
A_BLINK    // tekst migoczący
A_DIM       // połowa intensywności
A_BOLD     // dodatkowa intensywność
A_INVIS    // znak niewidoczny
A_CHARTEXT   // tworzy maskę bitową odpowiadającą znakowi
// Wybrane znaki grafiki konturowej
ACS_ULCORNER   // górny lewy róg
ACS_LLCORNER   // dolny lewy róg
ACS_URCORNER   // górny prawy róg
ACS_LRCORNER   // dolny prawy róg
ACS_HLINE       // linia pozioma
ACS_VLINE      // linia pionowa
ACS_TTEE    // T w dol
ACS_BTEE    // T w gore
ACS_LTEE    // T w prawo
ACS_RTEE    // T w lewo
ACS_PLUS    // duzy +

// Sprawdzenie bieżących ustawień tła
chtype getbkgd(WINDOW *win);
// Ustawianie właściwości tła
int bkgd(const chtype ch);
int wbkgd(WINDOW *win, const chtype ch);
bkgd('.');  // zastosowanie

int attron(int at);
int wattron(WINDOW *win, int at);
attron(A_BOLD); /* zastosowanie */
attron(A_REVERSE | A_BLINK);

int attroff(int at);
int wattroff(WINDOW *win, int at);

int attrset(int at);     /* wg Introduction */
int wattrset(WINDOW *win, int at);
attrset(A_NORMAL); /* przywrócenie normalnego stanu */

PROCEDURY WYJŚCIOWE

Standardowe procedury wyjścia C nie działają z oknami ncurses, ponieważ ncurses przechwytuje wyjście na terminal. Procedury wyjścia można podzielić na trzy kategorie:

Funkcje można stosować wymiennie i jest kwestią gustu, które zastosujemy.

ncurses mają znaki wpisane w formacie chtype (unsigned long int), a wysokie bity są używane do przenoszenia dodatkowych informacji (atrybuty wideo). Normalne znaki w C są typu char. W ncurses można korzystać ze znaków grafiki konturowej, których oznaczenia rozpoczynają się od ACS_. Można również rysować linie poziome i pionowe.

Atrybuty możemy ustawić dla pojedyńczego znaku wewnątrz funkcji addch(), np. addch(ch | A_BLINK). Można łączyć kilka atrybutów za pomocą symbolu |. Możemy również zmienić domyślne ustawienia atrybutów dla okna funkcjami typu attrset(), attron(), attroff(). Funkcje attron() i attroff() włączają i wyłączają podane atrybuty. Natomiast attrset() nadpisuje poprzednie ustawienie atrybutów przez nowo podane.

Funkcje, których nazwy zawierają chstr, działają na łańcuchach pseudoznaków.

Funkcje, których nazwy zawierają str, działają na standardowych łańcuchach zakończonych zerem.


Programowanie z ncurses (index)