NCURSES库简介

5月16日
第一章 NCURSES库简介
在使用电传终端作为计算机输出设备的那个年代,电传终端是和计算机分开放置的,并通过串行电缆连接。终端的配置通过发送一系列字节完成。所有的终端控制操 作:改变光标在屏幕上的位置,清除屏幕某一区域的内容,屏幕滚动,切换显示模式,给文字添加下划线,改变字符的外观、颜色、亮度等等,也是通过这样一系列 字节实现的。由于这些连续的控制字节以一个转义字符“0x1B”(即ESC键)作为起始字节,所以这种控制序列叫做转义序列。即使在当今,我们也可以向终 端仿真程序发送转义序列,得到和当年电传打字终端相同的显示效果。

假设你想在终端(或终端仿真窗口)输出一段彩色的文字,可以将以下这段转义序列输入到你的字符控制台(或控制台窗口):
echo "^[[0;31;40mIn Color"           

在 这里 “^[” 就是所谓的转义字符。(注意:“^[” 是一个字符,不是依次键入“^”和“[”字符。要输出“^[”,必须按下Ctrl-V再按下ESC键)执行以上的命令,就应该可以看见“In Color”变为红色了(译者注:试更改转义字符各分号间的参数,看看会有什么结果)。以后输出的文本信息都是这样的效果。 如果想返回原来的颜色设置可以使用以下的命令:
echo "^[[0;37;40m"                  

现在体会到这些神奇字符(转移序列)的作用了吗?然而这些奇怪的字符是不是很难理解呢?并且有时相同的转义序列在不同的终端上会有不同的显示结果。因此,UNIX的设计者发明了一种叫做 termcap的机制。
termcap 是一个列出特定终端的所有功能的文本文件,并且给出了实现对应功能的转义序列。然而在这种机制发明后的几年中,逐渐被terminfo机制取代。程序员使 用terminfo时不用花过多的时间查阅termcap。只需让程序查询terminfo的数据库就可得到控制字符,并将其发送到终端或终端仿真程序。
1.1 NCURSES是什么?
你可能会疑惑,引入的这些技术术语是什么。假设在使用termcap或者terminfo的情况下,每 个应用程序都在访问terminfo数据库并且做一些必要的处理(比如发送控制字符等等)。不久这些操作的复杂度将会变得难以控制。于是,curses诞 生了。curses 的命名是来自一个叫做 “cursor optimization”(光标最优化)的双关语(译者注:curses本身有诅咒的意思)。curses构成了一个工作在底层终端代码之上的封装,并 向用户提供了一个灵活高效的API(Application Programming Interface 应用程序接口)。它提供了移动光标,建立窗口,产生颜色,处理鼠标操作等功能。使程序员编写应用程序不需要关心那些底层的终端操作。

那 么ncurses又是什么?ncurses是最早的System V Release 4.0 (SVr4)中 CURSES的一个克隆。这是一个可自由配置的库,完全兼容旧版本的curses。简而言之,它是一个管理应用程序在字符终端显示的函数库。当后面提到 curses的时候,同时也可以和NCURSES互换。
关于ncurses详细的更新历史可以查阅ncurses源代码分发包中的NEWS文件。Thomas Dickey是目前的维护人员。你可以通过bug-ncurses@gnu.org联系维护人员
1.2 我们可以用NCURSES做什么?
ncurses 不仅仅封装了底层终端功能,而且提供了一个相当稳固的工作框架(Framework)可以在字符模式下产生美观的界面。它提供了一些创建窗口的函数。而它 的姊妹库 Menu、Panel和Form则对curses基础库及进行了扩展。这些扩展库通常都随同curses一起发行。我们可以建立一个同时包含多个窗口 (multiple windows)、菜单(menus)、面板(panels)和表单(forms)的应用程序。窗口可以被独立管理,例如让它滚动或者隐藏。
 
菜单(Menus)可以让用户建立命令选项,方便用户执行命令。而表单(Forms)允许用户建立一些简单的数据输入和输出的窗口。面板(Panels)是ncurses窗口管理功能的扩展,可以用它覆盖或堆积窗口。
 
 以上这些就是ncurses的简单介绍。在以后的章节里,我们将详细的介绍这些库。
1.3在哪能得到它
现在你知道你可以用ncurses做什么了吧。使用ncurses之前你必须先安装它,通常在安装操作系统(Unix/Linux)时它已被安装。如果你的操作系统里没有ncurses,你可以通过以下的途径安装:
 
编译ncurses包:
ncurses 可以从ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz获得。也可以通过GNU的FTP目录: http://www.gnu.org/order/ftp.html 找到提供免费下载ncurses的站点。最新发布的稳定版本为:5.2 20001021.(译者翻译时已经有5.4版本的ncurses下载了)

tar文件包中的README和INSTALL文件是安装ncurses库的主要资料。通常是按以下方法安装ncurses的:
tar zxvf  ncurses<version>.tar.gz        # 解压缩并且释放文件包
cd ncurses<version>                    # 进入解压缩的目录(注意版本)
./configure                            # 按照你的系统环境制作安装配置文件
make                                # 编译源代码并且编译ncurses库
su root                                # 获得root权限
make install                            # 安装编译好的NCURSES库
使用RPM安装文件:
可以在http://rpmfind.net 找到ncurses的RPM格式安装包。可以在root模式下使用以下的命令安装:
rpm –i <下载的RPM文件>
1.4 本文档的写作意图和涵盖范围
这部文档的写作目的是要成为一份ncurses以及子函数库的综合编程指南。我们将从一个简单的“Hello World”程序开始,循序渐进的学习掌握ncurses各方面更复杂、高级的内容。因此假定读者在此之前没有使用ncurses库的经验。
 
1.5 关于文档中出现的程序
这 份文档中用到的所有程序已经被打包并压缩成一个tar.gz文件。可以在http://www.linuxdoc.org/HOWTO/NCURSES- Programming-HOWTO/ncurses_programs.tar.gz 下载到。以下是这个压缩包解压缩后的目录结构:

ncurses
   |    
   |----> JustForFun                    -- just for fun 部分的程序    
   |----> basics                        -- 一些基础部分的程序
   |----> demo                         -- make 之后的程序
   |       |
   |       |----> exe                 -- 一些已编译的可执行示例程序
   |----> forms                       -- 和form 库相关的程序
   |----> menus                      -- 和menus 库相关的程序
   |----> panels                      -- 和 panels 库相关的程序
   |----> Makefile                    -- 一级目录的下的 Makefile
   |----> README                  -- 一级目录下的 README 文件包含程序说明。
   |----> COPYING                   -- 程序版权信息文档。
 
这些目录下包扩以下的文件:
JustForFun
    |
    |----> hanoi.c                   -- 汉诺塔示例
    |----> life.c                   -- 生命游戏
    |----> magic.c                   -- 数字幻方
    |----> queens.c                  -- 皇后问题
    |----> shuffle.c                 -- 智力拼图
    |----> tt.c                      -- 一个非常简单的打字练习程序
   basics
    |
    |----> acs_vars.c               -- 可选字符(ACS)变量示例
    |----> hello_world.c             -- 简单的“Hello, World!”程序    
    |----> init_func_example.c       -- 初始化函数示例
    |----> key_code.c                -- 显示键盘字符代码的程序
    |----> mouse_menu.c            -- 一个可以使用鼠标访问的菜单
    |----> other_border.c             -- 展示与box()函数不同的显示边框的其它函数
    |----> printw_example.c          -- 一个非常简单的使用printw()函数的例子
    |----> scanw_example.c           -- 一个非常简单的使用getstr()函数的例子
    |----> simple_attr.c             -- 一个在屏幕上打印C源程序注释的例子
    |----> simple_color.c            -- 一个简单的演示颜色的例子
    |----> simple_key.c               -- 一个可以用方向键访问的菜单的例子
    |----> temp_leave.c              -- 一个演示临时离开CURSES模式的例子
    |----> win_border.c              -- 展示窗口和边框的例子
    |----> with_chgat.c              -- chgat()函数使用的例子
 
  forms
    |
    |----> form_attrib.c             -- 展示field属性的用法
    |----> form_options.c            -- 展示field选项的用法
    |----> form_simple.c             -- 一个简单的表单例子
    |----> form_win.c                -- 一个简单的窗口和表单联合使用的例子
 
  menus
    |
    |----> menu_attrib.c             -- 展示菜单属性的用法
    |----> menu_item_data.c          -- 展示 item_name() 等等函数的用法
    |----> menu_multi_column.c       -- 建立多列菜单
    |----> menu_scroll.c             -- 展示菜单滚动的示例
    |----> menu_simple.c             -- 一个用方向键控制菜单的例子
    |----> menu_toggle.c             -- 建立多值菜单和解释 REQ_TOGGLE_ITEM
    |----> menu_userptr.c            -- 用户指针的用法
    |----> menu_win.c                -- 菜单和窗口结合的演示例子
    
  panels
    |
    |----> panel_browse.c            -- 通过 tab 浏览展示用户指针的用法
    |----> panel_hide.c              -- 隐藏和取消隐藏面板的例子
    |----> panel_resize.c            -- 移动和改变面板大小的例子
    |----> panel_simple.c            -- 一个简单的面板使用例子

perl
|---->01-10.pl                    --前10个例子的perl语言版

Makefile包含在一级主目录里。它将会把所有的程序编译成可执行的文件。并把这些文件存在demo/exec目录下面。你也可以选择将其编译到别的目录下。每个目录下都有一个README文件详细描述了每个目录下的C源程序的内容。
 
对于每一个示例,我都给出了这些程序调用NCURSES目录下相关文件的路径名。

如果你希望在线阅读这些程序中某个单独的程序,可以通过浏览器访问一下网址:http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/
所有以上发布的程序都遵照和NCURSES相同的许可协议(MIT-Style),  这个协议使你可以做除了得到他们以外更多的事情。你可以更自由的使用它们。

1.6 关于此文档的其他文件发布格式
这份HOWTO文档还有很多其它的文件发布格式,可以在tldp.org 下载到。以下是关于这份文档其它格式的下载链接:
1.6.1可以从从tldp.org得到的格式:
Acrobat PDF 格式
PostScript格式
多页的HTML文档
单页的HTML文档
1.6.2从源代码编译
如果以上链接出现问题,或者你想自己使用sgml进行实验,请遵循以下步骤:
1、从以下两个地址下载源代码包和tar.gz的示例程序压缩包:
http://cvsview.tldp.org/index.cgi/ldp/howto/docbook/ncurses-howto/NCURSES-Programming-HOWTO.sgml
http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/NCURSESHOWTO/ncurses_programs.tar.gz
2、解压缩示例程序包:
tar zxvf ncurses_programs.tar.gz

3、用jade程序建立各种各式的文档,如果你想创建多页的HTML文档:
jade -t sgml -i html -d 风格样式表文件 NCURSES-Programming-HOWTO.sgml

如果需要PDF格式,首先要建立单页的HTML文档:
jade -t sgml -i html -d风格样式表文件 -V nochunks NCURSES-Programming-HOWTO.sgml > NCURSES-ONE-BIG-FILE.html

然后利用这份文档和htmldoc工具创建PDF文档:
htmldoc --size universal -t pdf --firstpage p1 -f 输出的.pdf文件全名 NCURSES-ONE-BIG-FILE.html

也可以用来生成PS文档:
htmldoc --size universal -t ps --firstpage p1 -f 输出的.ps文件全名NCURSES-ONE-BIG-FILE.html

详细信息请访问LDP Author Guide (LDP 作者指南)可以获得更多信息,如果都失败了,请和作者ppadala@gmail.com联系,也可以联系译者byronm@sina.com

1.7 原文贡献者
感谢Sharath(sharath_1@usa.net)和Emre Akbas编写了其中的一些段落。简介部分最初由Sharath写成。当重新写这部分的时候饮用了他最初完成的部分。Emre帮忙编写了printw()函数和scanw()函数部分。

Perl语言版示例程序的提供者Anuradha Ratnaweera(aratnaweera@virtusa.com)。

然 后是Ravi Parimi(parimi@ece.arizona.edu)。他是这个项目最初的实现者。在撰写这份文档时,他对这份文档提供了很多的意见。并且在文 章撰写完毕后耐心的校对了整份文档。他还在Linux和Solaris平台上检查过文中使用的每一个程序。你可以从他的注记中发现你的问题。
 
1.8远景规划
下面是正在进行或者将要进行的项目。如果你有新的项目或者想加入某个项目。请和Padala联系。
给最后讲述form库的一章增加更多的示例程序。(这个项目Padala正在进行)
准备一个演示程序展示文档中所有的示例。同时允许用户通过程序描述展示这些示例。
让用户亲自编译并且察看这些程序。一个有对话框的用户界面更好。(这个项目N.N.Ashok正在进行)
加入Debug信息,使用 _trace,_tarcemouse 。
通过NCURSES库中的函数访问termcap或tremios
使用户可以同时在两个终端上工作。 在“其它特色”章节(Miscellaneous features)中增加一些东西。

 

 

 

1.9 版权声明
Copyright ?2001 by Pradeep Padala.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, distribute with modifications, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization.

NCURSES Programming HOWTO 中文版(第二版)版权声明
此HOWTO文档的译文由Byron完成,在LDP许可协议下可以您可以自由发布或修改。因为时间紧迫,也受能力所限,有翻译不当之处请批评指正,有任何意见或建议请联系byronm@sina.com

Locations of visitors to this page

统计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值