Linux中终端图形编程库curses库使用教程Word文件下载.docx
- 文档编号:15690642
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:14
- 大小:26.07KB
Linux中终端图形编程库curses库使用教程Word文件下载.docx
《Linux中终端图形编程库curses库使用教程Word文件下载.docx》由会员分享,可在线阅读,更多相关《Linux中终端图形编程库curses库使用教程Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
rogue是一个古老的基于文本的的冒险类游戏。
在当时,仅仅控制游戏屏幕的外观显示就需要编写大量的代码,因为它们使用的是古老的termios甚至是tty接口。
巨大的工作量迫使BillJoy和KenArnold将rogue游戏中的所有的屏幕处理和光标移动的函数汇集到一个函数库中。
这就形成了最早的也是最简单的curses处理库的雏形。
它最终随着BSDUNIX的早期版本发行开来。
在这个版本中使用的是当时业已存在的termcap数据库来描述终端信息。
后来贝尔实验室的MarkHorton在SystemIIIUNIX中重新编写了curses。
它相对以前的版本有了很大的扩展和提高,增加了一些非常新的特性。
它首先将termcap数据库改进为terminfo数据库。
terminfo数据库完全由Horton开发编写,它是从termcap发展而来,而且更为中要重要的是其中引进了参数化性能的概念,这样使得描述多视频属性以及彩色终端成为可能。
在后来的AT&
TSystemV版本中,curses就扩展了更多功能和性能,包括了对窗体、菜单、面板、表单等组件以及对鼠标的支持。
这时候的curses内容以及设计与最初的BSD版本的curses在功能和复杂性上已经相去甚远。
1.1.2curses包内容
本书的curses以SystemVUNIX的版本为主,curses包主要包括下面的四个开发库,如表1.1所示。
在后面的章节中我们会针对每一个库进行详细深入的探讨。
表1.1curses包内容
库名
描述
curses
最早的curses包只包含这一部分,主要控制屏幕的输入和输出,光标的操作,窗口的创建和操作等。
panel
类似于窗口堆栈,不同的窗口可以存放于其中,并且可以在其中进行移动。
menu
新增的部分,主要包括创建菜单并且与之交互的函数,主要用来接受用户的选择。
form
包括创建表单以及与之进行交互的函数,主要用来接受用户数据输入
1.1.3curses包移植性
正如前言部分我们曾经提到过,使用curses包与使用低层终端函数编写的程序最主要的差别在于curses程序是独立于具体终端的,也就是说在某个终端上编写的程序可以完整的移植到另外的终端上而不需要进行任何改动。
curses包的可移植性是curses包的最大特性。
curses包的这种终端独立性归根于终端描述数据库terminfo和termcap。
terminfo和termcap数据库中包含了所有终端的描述信息。
termcap数据库是在最早的的BSDUNIX中使用,在后来的SystemIII中则使用terminfo数据库。
terminfo数据库是从termcap数据库发展而来,组织方式相对于termcap来说有了进一步的优化,而且描述的终端信息有了进一步的增加。
需要使用的数据库可以在程序编译的时候通过cc命令指定,具体的细节在这一章的末尾会有探讨。
正如前面所说,curses正是通过使用terminfo数据库使得程序可以在不同的终端上可以移植,那么系统是如何做到这一点的呢?
从第一章的图0.1可以看出,对于使用curses进行处理的程序员来说他实际上处理的是虚拟终端。
curses完成了物理终端到虚拟终端的“映射”。
用curses编写的程序在它们每次被调用的时候都需要引用终端描述数据库。
数据库中的终端描述信息包括了终端的一系列的性能参数,在curses包中我们定义了很多的变量与这些性能参数对应。
当程序执行的时候,程序首先获取终端类型,然后根据终端类型获取终端描述数据库中具体的性能,最后将这些性能参数读进curses中预定义的相应的变量中。
当程序与终端进行交互从而需要调用相应的函数的时候,它将从头文件的性能变量中为终端获取必要的控制码,一旦需要某个性能参数,只要找到相应的变量即可,从而达到以不变应万变的效果。
例如在curses包中我们定义了LINES和COLS变量对应终端能够显示的最大行数和最大列数这两个性能,不同的终端的LINES和COLS的值可能不同,比如通常的终端的行数为39行,如果使用了软标签,行数将减一变为38。
但这种变化都由curses幕后自动完成,用户完全不需要理会,用户需要记住的仅是LINES和COLS以及它们代表的含义。
这样,程序就可以运行在各种不同的终端上,唯一的缺陷就是这种终端首先必须在终端信息描述库中存在,否则就无法直接使用curses包,弥补的办法就是需要自己在终端信息描述库中增加终端描述信息。
1.2使用curses包示例
1.2.1简单的curses应用程序
现在我们先看一个简单的curses应用程序1-1,这个程序中包含了curses包中最常使用的一些函数,也许开始看不懂,我们会在后面进行详细的讲解。
程序1-1简单的curses程序
程序名称bullseye.c
编译命令cc–obullseyebullseye.c–lcurses
#include<
curses.h>
signal.h>
staticvoidfinish(intsig);
main(intargc,char**argv)
{
(void)sigaction(SIGINT,finish);
initscr();
//初始化curses包
keypad(stdscr,TRUE);
//允许键盘映射
(void)nonl();
(void)cbreak();
(void)noecho();
//判断是否支持彩色
if(has_colors())
{
start_color();
//初始化颜色配对表
init_pair(0,COLOR_BLACK,COLOR_BLACK);
init_pair(1,COLOR_GREEN,COLOR_BLACK);
init_pair(2,COLOR_RED,COLOR_BLACK);
init_pair(3,COLOR_CYAN,COLOR_BLACK);
init_pair(4,COLOR_WHITE,COLOR_BLACK);
init_pair(5,COLOR_MAGENTA,COLOR_BLACK);
init_pair(6,COLOR_BLUE,COLOR_BLACK);
init_pair(7,COLOR_YELLOW,COLOR_BLACK);
}
attron(A_BLINK|COLOR_PAIR
(2));
move(LINES/2+1,COLS-4);
addstr(“Eye”);
refresh();
sleep
(2);
move(LINES/2–3,COLS/2-3);
addstr(“Bulls”);
finish(0);
}
staticvoidfinish(intsig)
endwin();
exit(0);
在上面的程序1-1中我们只是简单的将光标移动到屏幕中央附近的两个不同位置,然后在这两个位置上输出单词BlueEye和Bulls,字体的颜色分量分别为(Green,Green,Black),并同时进行闪烁。
我们通过函数move()进行光标移动以及函数addstr()输出单词。
下面我们详细讨论这个程序所涉及到的问题,这些问题对所有的使用curses包的程序都是非常重要的。
1.2.2开始使用curses包
1.2.2.1头文件
每一个使用curses包的程序都必须在程序中包括相应库所使用的头文件。
头文件中定义了各种各样的数据类型以及宏,同时声明了各种能够在程序中引用的常量和函数。
我们通常所用到的头文件如表1.2所示。
表1.2curses包以及其对应的头文件
头文件
curses.h
panel.h
menu.h
form.h
我们在使用curses编写程序的时候可能会用到上面的一个以上的库。
但是curses库是每一个程序都必须包含的,它定义的一些公共的函数和变量是每一个curses程序都需要的。
另外,在程序进行编译的时候我们必须将使用到的所有的库都一起编译进去,否则程序将无法编译通过。
如果用户在AT&
TUNIXPC上使用终端访问方法(TAM–TerminalAccessMethod)进行编程的话,则还需要包括TAM库。
一旦程序正确编译,它就可以执行并进行调试。
同时系统中的环境变量必须设置正确,这样编译程序才能找到终端描述数据库。
示例程序的一开始我们就包括了头文件curses.h。
curses.h中定义了LINES和COLS两个变量。
程序中通过这两个变量来计算光标的位置从而能够通过move函数将光标放置在屏幕的中央附近。
由于这两个值是与具体的终端的尺寸关联的,因此不管我们的程序运行在什么样的终端上,光标的位置都是处于屏幕的相同的位置。
另一方面curses.h中也定义了refresh(),实际上它是一个宏定义,具体的定义如下:
#definerefresh()wrefresh(stdscr)
从上面的定义可以看出,窗口中调用refresh()实际上是调用函数wrefresh()来对标准屏幕进行刷新。
不仅refresh(),事实上curses中的很多函数都是这种伪函数。
它们之间遵循一定的命名规范,我们在第二章将详细讨论。
为了能够在程序意外中断的时候对curses包进行必要的处理,我们对中断信号进行适当处理,因此必须包含信号处理的头文件signal.h。
同时我们定义了信号处理函数finish();
1.2.2.2curses初始化
在主函数中设置了信号处理函数之后我们就调用了initscr(),一般情况下在其余的curses函数被调用之前我们就必须首先调用initscr()。
initscr()对curses包进行一些初始化的工作,而且在每一个程序里面,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 终端 图形 编程 curses 使用 教程