Linux终端图形库curses

curses是一个用于终端图形编程的库,起源于Berkeley,现广泛应用于Unix和Linux系统。它提供屏幕管理、键盘输入和输出功能,如窗口、子窗口、光标移动、字符属性设置等。curses的使用包括初始化、编译、屏幕操作、键盘模式设置以及彩色显示等。文章通过一个简单的示例展示了如何使用curses输出‘Hello,world!’。
摘要由CSDN通过智能技术生成

Linux终端图形库curses简介

curses的名字起源于"cursor optimization",即光标优化。它最早由美国伯克利大学的Bill Joy和Ken Arnold编写的,用来处理一个游戏rogue的屏幕显示。后来贝尔实验室的Mark Horton在system III Unix中重新编写了curses。

现在几乎所有的Unix,Linux操作系统都带了curses函数库,curses也加入了对鼠标的支持,一些菜单和面板的处理。可以说,curses是Linux终端图形编程的不二选择(比如著名的文字编辑器vi就是基于curses编的)

安装和编译

安装命令:

sudo apt-get install libncurses5-dev

编译命令:

gcc program.c -o program -lcurses

curses术语和概念

curses使用两个数据结构映射终端屏幕,stdscrcurscr

  • stdscr是“标准屏幕”(逻辑屏幕),在curses函数库产生输出时就刷新,是默认输出窗口(用户不会看到该内容)。
  • curscr是“当前屏幕”(物理屏幕),在调用refresh函数时,函数库会将curscr刷新为stdscr的样子。

curses工作在屏幕,窗口和子窗口之上。屏幕是设备全部可用显示面积(对终端是该窗口内所有可用字符位置),窗口与具体例程有关,如基本的stdscr窗口等。

使用initscr()endwin()两个函数对函数库进行初始化和重置。

WINDOW* initscr(void);
int endwin(void);

示例:“Hello, world!”之curses版

#include<curses.h>
int main()
{
 initscr(); //初始化屏幕进入curses图形化工作方式
 box(stdscr,ACS_VLINE,ACS_HLINE);//画一个框
 move(LINES/2,COLS/2);//光标移到中心
 waddstr(stdscr,"hello,world!");//输出
 refresh();//逻辑屏幕的改动在物理屏幕(显示器)上显示
 getch();//屏幕暂停
 endwin();//结束curses
 return 0;
}

stdscr就是标准屏幕,ACS_VLINEACS_HLINE代表构成方框两边的基本元素,LINESCOLS是curses定义的宏,代表当前屏幕最大行数和列数,waddstr()函数的作用是在stdscr上打印字符串"hello world!"

输出到屏幕

int addch(const chtype char_toadd);
int addchstr(chtype* const string_to_add);//当前位置添加字符(串)
int printw(char* format,...); //类似printf
int refresh(void); //刷新物理屏幕
int box(WINDOW* win_ptr,chtype vertical,chtype horizontal); //围绕窗口绘制方框
int insch(chtype char_to_insert);//插入一个字符(已有字符后移)
int insertln(void);//插入空白行
int delch(void);
int deleteln(void); //删除字符和空白行

int beep(void); //终端响铃
int flash(void); //闪烁

从屏幕读取字符

chtype inch(void); //返回光标位置字符
int instr(char *string); //读取字符到string所指向字符串中
int innstr(char *string,int numbers); //读取numbers个字符到string所指向字符串中

清除屏幕

int erase(void); //在屏幕的每个位置写上空白字符
int clear(void); //使用一个终端命令来清除整个屏幕,内部调用了clearok来执行清屏操作(在下次refresh时可以重现屏幕原文)
int clrtobot(void); //清除光标位置到屏幕结尾的内容
int clrtoeol(void); //清除光标位置到该行行尾的内容

移动光标

int move(int new_y,int new_x); //移动stdscr的光标位置

字符属性(加粗,反色显示等)

预定义的属性:A_BLINK, A_BOLD,A_DIM,A_REVERSE,A_STANDOUT,A_UNDERLINE

int attron(chtype attribute);
int attroff(chtype attribute); //启用和关闭属性
int attrset(chtype attribute);
int standout(void);
int standend(void); //这两个表示更加通用的强调模式,通常映射为反白显示

键盘模式

完成initscr后,输入模式为预处理模式:

  • 所有处理都是基于行的,即,只有按下回车输入数据才被传给程序
  • 键盘特殊字符启用,按下合适组合键会产生信号
int echo();
int noecho(); //用于开启和关闭键盘输入字符的回显

int cbreak(); //设置cbreak模式,字符一键入,直接传给程序
int nocbreak();//关闭

int raw(); //关闭特殊字符处理
int noraw(); //同时恢复默认模式和特殊字符处

键盘输入

//与标准io库的getchar,gets,scanf类似
int getch();
int getstr(char *string);
int getnstr(char *string,int number);//建议使用
int scanw(char *format,...);

窗口-WINDOW

curses函数库支持在一个物理屏幕上显示多个窗口

创建和销毁WINDOW窗口

WINDOW* newwin(int lines,int cols,int start_y,int start_x); //创建从(start_x,start_y)开始的lines行,cols列的窗口
int delwin(WINDOW* window); //销毁上面创建的窗口,千万不要删除stdscr和curses

当lines和cols为0时,说明新窗口右下角落在屏幕右下角上。

通用函数:前面的addch和printw函数用于在屏幕上增加字符,它们都可以通过增加前缀变为通用函数。

  • 前缀w用于窗口(添加一个WINDOWS指针参数)
  • mv用于光标移动(在该位置执行操作addch或printw,添加两个坐标值参数)
  • mvw用于在窗口中移动光标。

移动和更新窗口

int mvwin(WINDOW *win,int new_y,int new_x);//移动窗口
int wrefresh(WINDOW *win);
int wclear(WINDOW *win);
int werase(WINDOW *win); //类似于上面的refresh,clear,erase,但此时针对特定窗口操作,而不是strcsr
int touchwin(WINDOW *win); //指定该窗口内容已改变
int scrollok(WINDOW *win,bool flag); //指定是否允许窗口卷屏
int scroll(WINDOW *win); //把窗口内容上卷一行

子窗口

WINDOW* subwin(WINDOW* parant,int lines,int cols,int start_y,int start_x); //创建子窗口
int delwin(WINDOW* window); //销毁子窗口

彩色显示

curses能显示简单的彩色。必须同时定义一个字符的前景色和背景色,称为颜色组合。使用方法如下:
首先,检查终端是否支持彩色显示,然后对curses颜色例程初始化:

bool has_colors(void);
int start_color(void);

start_color成功返回OK,变量COLORS定义为可用颜色数目,一般为8种,COLORP_PAIRS定义为可用颜色组合数目,一般为64种。

int init_pair(short pair_number,short foreground,short background); //初始化pair_number号颜色组合
int COLOR_PAIR(int pair_number); //对pair_number号颜色组合作为属性来访问(用于前面的attr函数)
int pair_content(short pair_number,short*foreground,short *background); //获取已定义的颜色组合信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhugenmi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值