一,初始化和终止
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);返回窗口相对于父窗口的起始坐标
上面这四个宏用来得到光标的信息,