ncurses(new curses)是一个程序库,它提供了API,可以允许程序员编写独立于终端的基于文本的用户界面。它是一个虚拟终端中的“类GUI”应用软件工具箱。它还优化了屏幕刷新方法,以减少使用远程shell时遇到的延迟。[1]
(在内核文件夹中
$ make menuconfig
, 内核安装指导【入口】)
常见使用在Linux内核配置中配置界面
一些类似图形库
C: GTK
C++:QT
或者直接上Android
/
基础使用
- 头文件:
<curses.h>
- 常见操作与c库类似
- 打印:printw -> printf
int printw(const char *fmt, ...);
- 获取字符:getch ->getchar
int getch(void);
- endwind () 退出ncurses的窗口
initscr(); //ncurses界面的初始化函数
/* noecho(); //时输入不显示在交互界面中
cbreak(); */
printw("This is a ncurses window!"); //在ncurse模式下的打印函数
getch(); //等待用户输入
endwin(); //退出程序,调用函数来恢复shell终端显示,否则shell终端字乱码
基础函数
echo()和noecho()
The echo() function enables Echo mode for the current screen. The noecho() function disables Echo mode for the current screen[2]
控制键盘输入是否显示在终端上的函数,有的默认开启的可以使用noecho()函数进行关闭,这样在嗲用例如getch()时,屏幕上就不会显示键入的字符了,可以使用在例如输入密码情况下。
raw()和cbreak()
- 指定输入模式(当应用不确定调用initscr()时的模式是什么时,可以使用这些函数进行说明指定过的模式)
raw()模式不需要输入输出内核处理,所有输入原样立即输出。cbreak同样当输入时立即输出,且不会缓存(in-kernel line editing)。二者主要区别在于,首先cbreak保持其输出处理不变;其次任然可以使用^C(Ctrl + C)对其进行打断。而raw模式下输入任何字符都会被直接输出,不会有任何信号,中断[3]
关于交互程序,大多数程序员希望程序不要读取单个字符同时不产生反响或将字符显示在屏幕中
此时需要在调用initscr()之后再调用子程序noecho()和cbreak() [4]
keypad()
- int keypad(WINDOW *win, bool bf);
函数对用户键盘输入的读取使能,如果bf设置为TRUE,则当键盘按键按下时wgetch()会返回一个单独的值表示键值;若bf为FALSE,那程序必须解释转义序列本身。其中win为stdscr时表示标准键盘。 - 使用该函数后方向键以及f1,f2键可以生成一一对应的值,这些按键对应的值都被宏定义在curses.h头文件中(
$ vi /usr/include/curses.h
)
这里稍微注意,定义的值都大于char型所覆盖的大小范围(-128~128),所以存放这些值要起码2字节以上的类型如short或int等
refresh()
对当前输出在屏幕上的内容进行刷新;运行后对程序中显示的改变进行一次性的改变,对于未更改的显示内容不做刷新,节省了对新内容的绘制时间,更高效完成屏幕刷新
move()
int move(int y, int x);
ncurses 中光标的移动至坐标(x,y),相对于左上角的(0,0)
====================================================================================================================
[1] Wikipedia
[2] echo()/noecho() Specification
[3] CBreakAndRaw
[4] IBM