码迷,mamicode.com
首页 > 其他好文 > 详细

使用 curses 函数库管理基于文本的屏幕

时间:2016-08-02 11:22:05      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

curses 函数库提供了终端无关的方式来编写全屏幕的基于字符的程序。curses 还可以管理键盘,提供了一种简单易用的非阻塞字符输入模式。

curses 函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。

curses 函数库有多种不同的实现版本。Linux 使用的是 ncurses(new curses),可以使用 sudo apt-get install libncurses5-dev 安装。

在编译时使用 -lncurses 选项来链接 curses 函数库

gcc hello.c -lncurses
 1 #include <ncurses.h>
 2 
 3 int main()
 4 {
 5     initscr();
 6     move(5, 15);
 7     printw("%s", "hello world");
 8     refresh();
 9     getch();
10     endwin();
11     return 0;
12 }

运行后显示如下:

技术分享

 

curses 的概念

curses 例程工作在屏幕、窗口和子窗口上。所谓屏幕就是你正在写的设备(通常是终端屏幕,也可能是xterm屏幕)。屏幕占据了设备上全部的可用显示面积,当然,如果设备是X视窗中的一个终端窗口,则屏幕就是该终端窗口内所有可用的字符位置。无论何时,至少存在一个 curses 窗口,我们称之为 stdscr,它与物理屏幕的尺寸完全一样。你可以创建一些尺寸小于该屏幕的窗口,窗口可以互相重叠,它们还可以拥有自己的多个子窗口,但每个子窗口必须总是被包含在它的父窗口内。

curses 函数库用两个数据结构来映射终端屏幕,它们是 stdscr 和 curscr。两者中,stdscr 更重要,它会在 curses 函数产生输出时被刷新。stdscr 数据结构对应的是“标准屏幕”,是 curses 程序中默认输出窗口。curscr 数据结构和 stdscr 类似,但它对应的是当前屏幕的样子。在程序调用 refresh 函数之前,输出到 stdscr 上的内容不会显示在屏幕上。curses 函数库在调用 refresh 函数时比较 stdscr(屏幕将会是什么样子) 和 curscr(屏幕当前时什么样子)之间的不同之处,然后根据这个差异来刷新屏幕。

逻辑屏幕的布局通过一个字符数组来实现,它以屏幕的左上角——坐标(0,0)为起点,通过行号和列号来组织。所有的 curses 函数使用的坐标都是 y 值(行号)在前,x 值(列值)在后。

 

示例详解:

WINDOW *initscr(void);

initscr 函数将终端屏幕初始化为 curses 模式,它用来清除屏幕上所有的字符,并等待下一步处理。所以在调用其它的 curses 函数前,要先调用 initscr() 函数初始化屏幕。如果成功,返回一个指向 stdscr 结构的指针;如果失败,输出一条诊断错误信息并使程序退出。

int move(int new_y, int new_x);

move 函数用来把逻辑光标的位置移动到指定地点。

int printw(char* format, ...);

采用与 printf 函数相同的方法对字符串进行格式化,然后将其添加到光标的当前位置。

int refresh(void);

当使用 printw 函数打印时,字符串实际上是打印到 stdscr 的虚拟窗口上,没有直接输出到屏幕,而是在 stdscr 的缓冲区中。为了显示这些缓冲区中的数据,必须使用 refresh() 函数告诉 curses 系统将缓冲区的内容输出到屏幕。

int getch(void);

获取一个字符。

int endwin(void);

退出 curses 模式,释放 curses 子系统和相关数据结构占用的内存。

使用 curses 函数库管理基于文本的屏幕

标签:

原文地址:http://www.cnblogs.com/jingyg/p/5728361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!