9、Ncurses的初始化相关工作
(1)raw()和cbreak()
禁止行缓冲,在raw()函数模式下,处理挂起(CTRLZ)、中断或退出(CTRLC)等控制字符时,将直接传送给程序去处理而不产生终端信号,而cbreak()将产生终端信号。
(2)cho()函数和noecho()函数
控制是否将从键盘输入的字符回显在终端上。
(3)keypad()函数
允许使用功能键。
(4)initscr()函数
屏幕初始化并进入curses 模式
(5)printw()与refresh()函数
printw()函数的作用是不断将一些显示标记和相关的数据结构写在虚拟显示器上,并将这些数据写入stdscr 的缓冲区内。须使用refresh()函数告诉curses系统将缓冲区的内容输出到屏幕上。
下面例子演示了相关用法
(6)endwin()
函数释放了curses 子系统和相关数据结构占用的内存,使你能够正常返回控制台模式。
(7)addch()、printw()、addstr()
在curses 函数中有三类输出函数,它们分别是:
addch():将单一的字符打印到屏幕上,可以附加加字符修饰参数的一类函数。
printw():和printf()一样的具有格式化输出的一类函数。
addstr():打印字符串的一类函数,用于在指定窗口输出字符串
(8)mvprintw()
函数将光标移动到指定的位置,然后打印内容。
代码如下:
dp@dp:~/cursestest % cat 1.c
#include <ncurses.h>
#include <locale.h>
int main()
{
int ch;
setlocale(LC_ALL,"");
initscr(); / 开始curses 模式/
raw(); / 禁用行缓冲/
keypad(stdscr, TRUE); / 开启功能键响应模式/
noecho(); / 当执行getch()函数的时候关闭键盘回显/
printw(“请按键!”);
ch = getch(); /* 如果没有调用raw()函数,
我们必须按下enter 键才可以将字符传递给程序*/
if(ch == KEY_F(2)) / 如果没有调用keypad()初始化,将不会执行这条语句/
printw(“F2键按下!”);
/ 如果没有使用noecho() 函数,一些控制字符将会被打印到屏幕上/
else
{
printw(“按键是:”);
attron(A_BOLD);
printw("%c", ch);
attroff(A_BOLD);
}
refresh(); / 将缓冲区的内容打印到显示器上/
getch(); / 等待用户输入/
endwin(); / 结束curses 模式/
return 0;
}
编译并执行程序:
dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest
dp@dp:~/cursestest % ./mytest
(10)scanw()函数
能够在屏幕的任意位置读入格式化字符串。
(11)wscanw()函数和mvwscanw()函数
从一个窗口中读取数据
getstr()系列函数
这些函数用于从终端读取字符串。本质上,这个函数执行的任务和连续用getch()函数读取
字符的功能相同:在遇到回车符、新行符和文末符时将用户指针指向该字符串。
示例如下:
dp@dp:~/cursestest % cat 1.c
#include <locale.h>
#include <ncurses.h>
#include <string.h>
int main()
{
char mess[]=“您的性别:”; / 将要被打印的字符串信息/
char mesg[]=“您的名字:”; / 将要被打印的字符串信息/
char name[80];
char sex[10];
int row,col; / 存储行号和列号的变量,用于指定光标位置/
setlocale(LC_ALL,"");
initscr(); / 进入curses 模式/
getmaxyx(stdscr,row,col); / 取得stdscr 的行数和列数/
mvprintw(row/2,col/2-strlen(mesg),"%s",mesg); / 在屏幕的正中打印字符串mesg /
getstr(name); / 将指针name 指向读取的字符串/
mvprintw(row/3,col/2-strlen(mess),"%s",mess); / 在屏幕的正中打印字符串mesg /
getstr(sex); / 将指针sex向读取的字符串/
char man[]=“man”;
if (strcmp(sex,man)==0) {
mvprintw(LINES-2,0, “%s先生好,很高兴认识您”, name);//LINES为当前行数
}
else
{
mvprintw(LINES-2,0, “%s女士好,很高兴认识您”, name);//LINES为当前行数
}
refresh();
getch();
endwin();
return 0;
}
编译并执行程序:
dp@dp:~/cursestest % gcc -lncursesw 1.c -o mytest
dp@dp:~/cursestest % ./mytest
(11)窗口输入与输出
wprintw() 函数和mvwprintw 函数为输出函数,将在指定的窗口输出。
wscanw()函数和mvwscanw()函数从一个窗口中读取数据。
#include <ncurses.h>
#include <locale.h>
int main(){
//init_pair(short index,short foreground,short background)初始化颜色索引
//attron(COLOR_PAIR(索引号)|属性)
//newwin建立窗口,derwin建立窗口的子窗口(相对于父窗口相对位置),subwin建立窗口的子窗口(相对于根窗口绝对位置)
setlocale(LC_ALL,"");
char mesg[]="您的名字:"; / 将要被打印的字符串信息/
char name[80];
WINDOW *win1;
initscr();//初始化
win1=newwin(15,50,1,1);//新窗口(行,列,begin_y,begin_x)
box(win1,ACS_VLINE,ACS_HLINE);
mvwprintw(win1,1,1,"WIN1");
mvwprintw(win1,2,1,"您好");
mvwprintw(win1,3,1,"%s",mesg);
wscanw(win1,"%s",name);
mvwprintw(win1,5,1,"%s好,很高兴认识您", name);
wrefresh(win1);
endwin();//结束
return 0;
}
dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest
dp@dp:~/cursestest % ./mytest
(11)窗口输入与输出
wprintw() 函数和mvwprintw 函数为输出函数,将在指定的窗口输出。
wscanw()函数和mvwscanw()函数从一个窗口中读取数据。
#include <ncurses.h>
#include <locale.h>
int main(){
//init_pair(short index,short foreground,short background)初始化颜色索引
//attron(COLOR_PAIR(索引号)|属性)
//newwin建立窗口,derwin建立窗口的子窗口(相对于父窗口相对位置),subwin建立窗口的子窗口(相对于根窗口绝对位置)
setlocale(LC_ALL,"");
char mesg[]="您的名字:"; / 将要被打印的字符串信息/
char name[80];
WINDOW *win1;
initscr();//初始化
win1=newwin(15,50,1,1);//新窗口(行,列,begin_y,begin_x)
box(win1,ACS_VLINE,ACS_HLINE);
mvwprintw(win1,1,1,"WIN1");
mvwprintw(win1,2,1,"您好");
mvwprintw(win1,3,1,"%s",mesg);
wscanw(win1,"%s",name);
mvwprintw(win1,5,1,"%s好,很高兴认识您", name);
wrefresh(win1);
endwin();//结束
return 0;
}
dp@dp:~/cursestest % gcc -lncursesw 2.c -o mytest
dp@dp:~/cursestest % ./mytest