ncurses入门

 注意:在默认情况下,在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,scanw
 int 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_BLACK
        COLOR_RED
        COLOR_GREEN
        COLOR_YELLOW
        COLOR_BLUE
        COLOR_MAGENTA
        COLOR_CYAN
        COLOR_WHITE
   int 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);返回窗口相对于父窗口的起始坐标
 上面这四个宏用来得到光标的信息,

 

你可能感兴趣的:(File,null,character,终端,pair,colors)