ncurses库

来源:互联网 发布:java游戏开发技术 编辑:程序博客网 时间:2024/04/30 19:09
注意:在默认情况下,在ncurses库中,调试跟踪的选项开关是关闭的,为了启动调试功能,应连接ncurses的调试库ncurses_g,并且在你的代码中或者调用trace(N)或者或者将环境变量$NCURSES_TRACE设置为N,其中N是一个非零的正整数,这样将强制将调试输出到一个名为trace的文件中,并且N的值越大,调试输出的结果粒度越细,标准的跟踪级别是TRACE_ORDINARY也就是31。 一,初始化和终止WINDOW *initscr(void);SCREEN *newterm(char *type, FILE *outfd, FILE *infd);initscr用来创建和初始化stdscr,curscr,以及通过查询terminfo和termcap数据库来发现终端的能力和特性,如果在此过程中出现了错误,那么initscr将会显示提示信息,并终止程序的执行。如果函数执行成功将返回stdscr指针,否则返回NULL,并终止程序的执行。如果是多个终端,则需要用newterm来代替initscr的工作,他返回一个SCREEN类型的变量,用来在引用一个终端时使用。type是一个将被使用的字符串,用来代替环境变量$TERM,如果为NULL,则$TERM将被使用,outfd用来输出到终端的文件,infd从终端获得输入的文件。在使用一个终端时,必须先将终端设置为当前终端,SCREEN *set_term(SCREEN *new);int endwin(void);void delscreen(SCREEN* sp);在使用完之后应将释放资源,并将屏幕的模式设置回原来的状态,如果程序中没有使用newterm函数建立新的终端,那么只需要调用endwin来释放当前终端的资源,否则就应该使用delscreen来删除用newterm建立的SCREEN。#include <stdlib.h>#include <curses.h>int main(void){initscr();printw("This is a curses window.\n");refresh();getch();endwin();return 0;}二,输入输出int addch(chtype ch);int echochar(const chtype ch);int insch(chtype ch);int addchstr(const chtype *chstr);int addchnstr(const chtype *chstr, int n);int addstr(const char *str);int addnstr(const char *str, int n);他将字符ch显示到当前窗口光标所在的位置,并移动光标到下一个位置,如果输出超过右边界,则会折行显示,如果开启滚动,并且光标处于可滚动区域的底部,该区域将向前滚动一行,同时,字符在输出的时候还可以与下面的值进行或操作进行输出。A_NORMAL Normal display (no highlight) 标准模式A_STANDOUT Best highlighting mode of the terminal. 使用终端的最好的加亮模式A_UNDERLINE Underlining 加下划线A_REVERSE Reverse video 使用反转视频A_BLINK Blinking 闪烁文本A_DIM Half bright 半强度显示A_BOLD Extra bright or bold 超强度显示A_PROTECT Protected mode A_INVIS Invisible or blank mode 字符设为不可见A_ALTCHARSET Alternate character set A_CHARTEXT Bit-mask to extract a character 创建一位掩码以进行字符的提取COLOR_PAIR(n) Color-pair number n 函数insch用来插入一个字符,插入后光标的位置不会改变,但后面的字符会向后移动,若超出右边界,则会丢失。addchstr在输出时光标并不移动,如果超过右边界将会被截断,addstr函数在输出时光标向后移动,并且在超过右边界的时候将会折行输出。#include <curses.h>int main(void){initscr();addch('T' | A_STANDOUT);addch('e' | A_UNDERLINE);addch('s' | A_DIM);addch('t' | A_BOLD);printw("\nTest string\n1111111111111111111111111\n");refresh();getch();move(2, 3);insch('2' | A_BOLD);refresh();getch();addstr("test");getch();endwin();return 0;}int bkgd(chtype ch);chtype getbkgd(WINDOW *win);bkgd函数用来设置背景属性,ch是前面所说的属性的一个或多个相或的结果。getbkgd用来或个指定窗口的属性值。#include <curses.h>int main(void){chtype ch;initscr();ch = getbkgd(stdscr);bkgd(ch | A_UNDERLINE);addstr("test");getch();endwin();return 0;} int box(WINDOW *win, chtype verch, chtype horch);int border(chtype ls, chtype rs, chtype ts, chtype bs,chtype tl, chtype tr, chtype bl, chtype br);这两个函数都会沿着窗口的边界划线,也就是绘制窗口的边界。int hline(chtype ch, int n);int vline(chtype ch, int n);这两个函数分别用来画一条水平线和一条垂直线。int erase(void);int werase(WINDOW *win);int clear(void);int wclear(WINDOW *win);int clrtobot(void);int wclrtobot(WINDOW *win);int clrtoeol(void);int wclrtoeol(WINDOW *win);这组函数用来做清屏的工作,erase将对窗口中每一个位置写空字符,clrtobot是从光标位置清除到底部,clrtoeol是从光标位置清除到光标所在行的结尾。#include <curses.h>int main(void){initscr();box(stdscr, '|', '-');move(4,4);hline('-', 10);vline('|', 10);getch();move(10, 10);clrtobot();getch();move(4, 4);clrtoeol();getch();endwin();return 0;}cursrs的输入函数可以简单的归结为getch,getstr,scanwint getch(void);int getstr(char *str); /*强烈建议使用getnstr代替*/int getnstr(char *str, int n);int scanw(char *fmt, ...);在这里需要声明的是,getstr和getnstr函数得到的字符串的结尾需要自己添加'\0';二,颜色的设置bool has_colors(void);在使用颜色的属性之前,必须要确保当前的终端支持色彩的显示,这可以通过has_colors来测试。如果支持则返回TRUE,否则返回FALSE。ncurses默认的颜色有:COLOR_BLACKCOLOR_REDCOLOR_GREENCOLOR_YELLOWCOLOR_BLUECOLOR_MAGENTACOLOR_CYANCOLOR_WHITEint start_color(void);当确定终端支持彩色显示之后,便可以调用start_color来初始化默认颜色值。int init_pair(short pair, short f, short b);我们使用init_pair来进行颜色的赋值,他将前景色f与背景色b和pair结合起来,供COLOR_PAIR使用。如果调用成功返回OK,否则返回ERR。int attron(int attrs);int attroff(int attrs);使用attron来直接设置当前窗口的属性,而不是分别为每一个字符设置属性,attroff用来关闭属性。详细见curs_attr(3)#include <curses.h>#include <stdlib.h>#include <unistd.h>int main(void){int i = 0;initscr();if (FALSE == has_colors()){addstr("Do not support colors\n.");sleep(1);exit(EXIT_FAILURE);}start_color();init_pair(1, COLOR_BLACK, COLOR_WHITE);init_pair(2, COLOR_RED, COLOR_WHITE);init_pair(3, COLOR_GREEN, COLOR_WHITE);init_pair(4, COLOR_YELLOW,COLOR_WHITE);init_pair(5, COLOR_BLUE, COLOR_WHITE);init_pair(6, COLOR_MAGENTA,COLOR_WHITE);init_pair(7, COLOR_CYAN, COLOR_WHITE);init_pair(8, COLOR_WHITE, COLOR_WHITE);for (i = 1; i < 9; i++){attron(COLOR_PAIR(i));printw("Test color No.%d\n", i);attroff(COLOR_PAIR(i));refresh();sleep(1);}getch();endwin();return 0;} 三,窗口管理 (curs_window(3))WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x);int delwin(WINDOW *win);int mvwin(WINDOW *win, int y, int x);WINDOW *subwin(WINDOW *orig, int nlines, int ncols,int begin_y, int begin_x);WINDOW *derwin(WINDOW *orig, int nlines, int ncols,int begin_y, int begin_x);int mvderwin(WINDOW *win, int par_y, int par_x);WINDOW *dupwin(WINDOW *win);newwin用来新建一个窗口,subwin和derwin都是建立子窗口,但不同的是subwin的位置是相对于屏幕来说的,而derwin是相对于父窗口来说的。#include <curses.h>int main(void){WINDOW *w0, * w1, *w2;initscr();w0 = newwin(20, 80, 1, 1);box(w0, '|', '-');wrefresh(w0);wgetch(w0);w1 = derwin(w0, 4, 4, 5, 5);box(w1, '*', '*');wrefresh(w1);wgetch(w1);w2 = derwin(w0, 3, 3, 15, 16);box(w2, '#', '#');wrefresh(w2);wgetch(w2);delwin(w2);delwin(w1);delwin(w0);endwin();return 0; }#include <stdlib.h>#include <curses.h>int main(void){SCREEN * scr;if (NULL == (scr = newterm(NULL, stdout, stdin))){perror("Failed on newterm\n");exit(EXIT_FAILURE);}if (NULL == set_term(scr)){perror("failed on set_term\n");endwin();delscreen(scr);exit(EXIT_FAILURE);}printw("Test newterm...\n");refresh();getch();endwin();delscreen(scr);return 0;}四,工具int putwin(WINDOW *win, FILE *filep);WINDOW *getwin(FILE *filep);函数putwin是将与窗口相关的数据写到文件中去,getwin则是从文件中读取窗口的相关数据。int scr_dump(const char *filename);int scr_restore(const char *filename);这两个函数完成的动作和上面两个和差不多,指示操作对象由窗口变成了屏幕。下面的函数从terminfo和termcap中读取信息:int baudrate(void); 以bps为单位返回终端的输出速率char erasechar(void); 返回用户当前取消的字符char killchar(void); 返回用户当前删除的字符 char *longname(void); 返回终端属性的描述(128个字节长度)char *termname(void); 返回$TERM的值,进截取前14个字符void getyx(WINDOW *win, int y, int x); 返回光标位置void getparyx(WINDOW *win, int y, int x);返回yx的最大取值void getbegyx(WINDOW *win, int y, int x);返回窗口的起始坐标void getmaxyx(WINDOW *win, int y, int x);返回窗口相对于父窗口的起始坐标上面这四个宏用来得到光标的信息,

原创粉丝点击