20210402

#include <ncurses.h>

Table of Contents

ncurses库

ncurses(new curses)是一套编程库,它提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。终端的图形界面库。这篇文章有对这个库的总结->文章

使用案例

这是一个使用ncurses库的程序,实现一个模拟的“球”在屏幕上来回反弹。代码如下:

#include <ncurses.h>
#include <unistd.h>
#define DELAY 30000
int main(int argc, char *argv[])
{
int x = 0;
int y = 0;
int max_x = 0,max_y = 0;
int next_x = 0;
int direction = 1;
initscr(); /* 初始化屏幕 */
noecho(); /* 屏幕上不返回任何按键 */
curs_set(FALSE); /* 不显示光标 */
/* getmaxyx(stdscr, max_y, max_x);/* 获取屏幕尺寸 */
mvprintw(5, 5, "Hello, world!");
refresh(); /* 更新显示器 */
sleep(1);
while(1)
{
getmaxyx(stdscr, max_y, max_x);/* 获取屏幕尺寸 */
clear(); /* 清屏 */
mvprintw(y, x, "O");
refresh();
usleep(DELAY);
next_x = x + direction;
if(next_x >= max_x || next_x < 0)
{
direction = (-1) * direction;
}
else
{
x = x + direction;
}
}
endwin(); /* 恢复终端 */
}

效果如图:

重点讲解

  1. 因为ncurses不是linux里默认的C函数库,所以编译的时候命令为gcc wildcard.c -o wildcar -l ncurses,即最后要加-l命令参数。不然直接编译会显示编译错误,因为linux找不到你所要用的库。
image.png
  1. refresh()函数:刷新界面,交换两个缓冲区,立刻显示,让用户自己定义何时进行显示,给用户更大的自由度。
  2. mvprintw(int y, int x, fmt, …):这个也是输出,是一定光标的输入点后,在接收输入字符.y 是第几行,x 是第几列.使用的 xy 和窗口坐标系是一致的,只是行数的参数第一个是 y 第二个是 x
  3. 开启和结束: 开始ncurses模式,需要initscr();返回一个WINDOWS指针,默认会使用stdscr.也可以自己接收处理,用于有多个win的情况;endwin();结束ncurses对终端的控制,终端还是那个终端,只是运行initscr后,ncurses获得了对终端的控制,可以理解为ncureses释放了终端。

ncurses控制的是当前终端,使用ncurses的程序退出后,ncurses对终端的影响还会起作用,因为不管那个程序,使用的是同一个终端,执行endwin,就避免了对下一个程序的影响,通常需要 atexit(func) 挂载一个退出钩子,执行这个函数。

  1. raw()函数和cbreak()函数。通常情况下,终端驱动程序会缓冲用户输入的字符,直到遇到换行符或回车符后,这些字符才可以被使用。但是大多数程序要求字符在输入时就可以被使用。raw()cbreak()两个函数都可以禁止行缓冲(line buffering)。区别是:在raw()函数模式下,处理挂起(CTRLZ)、中断或退出(CTRLC)等控制字符时,将直接传送给程序去处理而不产生终端信号;而在cbreak()模式下,控制字符将被终端驱动程序解释成其它字符。就我个人而言,比较喜欢使用raw()函数,因为用它可以做一些一般用户无法进行的控制操作。
  2. echo()函数和noecho()函数。这两个函数用来控制是否将从键盘输入的字符显示在终端上。调用noecho()函数禁止输入的字符出现在屏幕上。也许程序员希望用户在进行控制操作时,需要屏蔽掉控制字符(如组合键操作),或调用getch()函数读取键盘字符时,不想显示输入的字符(如在控制台输入登陆密码)。大多数的交互式应用程序在初始化时会调用noecho()函数,用于在进行控制操作时不显示输入的控制字符。 这两个函数给予程序员很大的灵活性,使程序员可以在窗口中的任意地方,实现输入字符的显示和屏蔽,而不需要刷新屏幕。
  3. keypad()函数。这个函数允许使用功能键,例如:F1、F2、方向键等功能键。几乎所有的交互式程序都需要使用功能键,因为绝大多数用户界面主要用方向键进行操作。 使用keypad(stdscr,TURE)就为“标准屏幕”(stdscr)激活了功能键。
  4. curs_set()函数。这个函数用来设制光标是否可见。它的参数可以是:0(不可见),1(可见),2(完全可见)。

之所以记录下这个库是因为最近有一门课要吃一份代码,代码中引入了这个库,并且也有上面所提到的几个重要函数,做个记录。


⚫🟣🟤🔵🟢🟠🔴