回 目 录
下 一 章

# 第一章：NCURSES库简介

### 1.1 介绍（Introduction）

  在广泛使用电传打字机的那个年代，电传打字机作为输出终端，通过电缆和中央电脑连接。用户要向终端程序发送一系列特定的控制命令，才可以控制终端屏幕的输出。

  比如要在改变光标在屏幕上的位置，清除屏幕某一区域的内容，卷动屏幕，切换显示模式，给文字添加下划线，改变字符的外观、颜色、亮度等等。这些控制都是通过一种叫做转义序列（escape sequence）的字符串实现的。叫做转义序列是因为这些连续字节都是以一个“0x1B”字符，即转义字符（按下ESC键所输入的字符）作为开头的字符串。即使在现在，我们也可以通过向终端仿真程序输入转义序列得到与当年电传打字终端同样的输出效果。

  如果你想在终端（或者终端仿真程序）屏幕输出一段背景是彩色的文字，可以将以下这段转义序列输入到你的命令行提示符：
  echo "^[[0;31;40mIn Color"

在这里 “^” 和 “[” 就是所谓的转义字符。（注意：在这里 “^[” 是一个字符。不是依次键入“^”和“[”字符。要打印出这个字符，你必须先按下Ctrl+V，然后按下ESC键。）执行以上的命令后。你应该可以看见“In Color”的背景变为红色了。从此以后显示的文本信息都是以这样的效果输出的。

  如果想终止这种效果并回到原来的方式可以使用以下的命令：
  echo "^[[0;37;40m"

现在知道这些字符（转移序列）的作用了吗？（译者注：更改分号之间的参数，看看会有什么结果。）也许会和自己想像的不一样？可能是因为终端环境不同，终端环境取决于终端或操作系统的不同。（你不可能让一个黑白终端显示出彩色字符吧？）

### 1.2 NCURSES是什么？

  你可能被以上的术语搅和的晕头转向了。假设在使用terminfo的情况下，让所有的应用程序访问terminfo数据库控制输出（比如发送控制字符，等等……）。不久这些调用代码将会使整个程序变得难以控制和管理。这些问题的出现导致了CURSES的诞生。CURSES的命名是来自一个叫做 “cursor optimization”（光标最优化）的双关语。CURSES库通过对终端原始控制代码（转义序列）的封装，向用户提供了一个灵活高效的API（应用程序接口）。它提供了一套控制光标，建立窗口，改变前景背景颜色以及处理鼠标操作的函数。使用户在字符终端下编写应用程序时绕过了那些恼人的底层机制。

  NCURSES是一个从System V Release 4.0 (SVr4) 中CURSES的克隆。这是一个可自由配置的库，完全兼容旧版本的CURSES。简而言之，他是一个可以使应用程序直接控制终端屏幕显示的库。当后面提到CURSES库的时候，同时也是NCURSES库。

  NCURSES包由Pavel Curtis发起，Zeyd Ben-Halim <zmbenhal@netcom.com>和Eric S. Raymond< esr@snark.thyrsus.com> 是最初的维护人员，他们在1.8.1及以后版本中增加了很多的新功能。Jürgen Pfeifer <juergen.pfeifer@gmx.net > 撰写了菜单库和面板库。使菜单和面板的机制和Ada95中捆绑的库一样好。Thomas Dickey < dickey@herndon4.his.com > 和Jürgen Pfeifer进行着NCURSES的维护工作。Florian La Roche < florian@gnu.org > 持有NCURSES的版权，他在自由软件基金会（GNU）中担任NCURSES的维护工作。如果要联系现在的NCURSES的维护者请发电子邮件至 < bug-ncurses@gnu.org > 。

### 1.3 NCURSES可以做什么？

  NCURSES不仅仅只是封装了底层的终端功能，而且提供了一个相当稳固的工作框架（Framework）用以产生漂亮的界面。它包含了一些创建窗口的函数。而它的姊妹库 Menu、Panel和Form则是对CURSES基础库的扩展。这些库一般都随同CURSES一起发行。我们可以建立一个同时包含多窗口（multiple windows）、菜单（menus）、面板（panels）和表单（forms）的应用程序。窗口可以被独立管理，例如让它卷动（scrollability）或者隐藏。

  菜单（Menus）可以让用户建立命令选项，从而方便执行命令。而窗体（Forms）允许用户建立一些简单的数据输入和显示的窗口。面板（Panels）是NCURSES窗口管理功能的扩展，可以用它覆盖或堆积窗口。

  以上这些就是NCURSES的一些基本介绍。在以后的章节里，我们将详细的介绍NCURSES库。

### 1.4 在哪能得到它

  你现在应该知道NCURSES可以做什么了。在你使用之前必须先下载它。你在安装操作系统时（Linux）应该已经附带了。万一如果你的操作系统还没有安装NCURSES库，可以通过以下的途径可以下载得到：

下载并编译安装文件包： 你可以通过 ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz 免费下载NCURSES。也可以通过GNU的FTP目录：http://www.gnu.org/order/ftp.html 找到提供免费下载NCURSES文件包的站点。最新发布的稳定版本为：5.2 20001021.（译者翻译时已经有5.4版本的NCURSES下载了）

  包裹文件中的README和INSTALL文件是安装NCURSES库的最主要资料。通常是这样安装NCURSES的：

tar zxvf ncurses.tar.gz | #解压缩并且释放文件包
cd ncurses | #进入解压缩的目录(注意版本)
./configure | #按照你的系统环境制作安装配置文件
make | #编译源代码并且编译NCURSES库
su root | #切换到root用户环境
make install | #安装编译好的NCURSES库

使用RPM安装文件：

可以在 http://rpmfind.net 找到NCURSES的RPM格式安装包。可以在root模式下使用以下的命令安装：（以5.2版本为例）

rpm –vih 下载的RPM文件

### 1.5 本文档的写作意图和涵盖范围

  这份文档是一份完整描述NCURSES库以及其姊妹库（sister libraries）的编程参考。在这份文档中我们将以一个用NCURSES库编写的“Hello, World!”程序作为起点。循序渐进的讲解NCURSES库中更多更复杂的操作。所以在撰写这份文档的时候假定读者不了解NCURSES库。

### 1.6 关于文档中出现的程序

  这份文档中用到的所有程序已经被压缩成一个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				-- 显示键盘字符代码的程序v

    |---->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			-- 一个简单的面板使用例子

Makefile包含在一级主目录里。它将会把所有的程序编译成可执行的文件。并把这些文件存在demo/exec目录下面。你也可以选择将其编译到别的目录下。每个目录下都有一个README文件详细描述了每个目录下的C源程序的内容。

  对于每一个示例，我都给出了这些程序调用NCURSES目录下相关文件的路径名。

  如果你希望在线阅读这些程序中某个单独的程序，可以通过浏览器访问一下网址：http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/.

所有以上发布的程序都遵照GPL（http://www.gnu.org/copyleft/gpl.txt）许可协议发行，你可以在许可协议允许的范围内任意处置程序。

### 1.7 关于此文档的其他文件发布格式

  这份HOWTO文档还有很多其它的文件发布格式，可以在tldp.org 下载到。以下是关于这份文档其它格式的下载链接：(译者注：此为英文版的下载链接。)

1.7.1 在tldp.org上的已发布格式链接：

  Acrobat PDF格式

  PostScript 格式

  多级HTML文档

  只有一页的HTML文档

### 1.8 原文贡献者

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

  然后是Ravi Parimi（parimi@ece.arizona.edu）。他是这个项目最初的实现者。在撰写这份文档时，他对这份文档提供了很多的意见。并且在文章撰写完毕后耐心的校对了整份文档。他还在Linux和Solaris平台上检查过文中使用的每一个程序。你可以从他的注记中发现你的问题。

### 1.9 远景规划

  这些是正在进行或者将要进行的项目。如果你有项目或者想加入某个项目。请和Padala联系。

· 给最后讲述form库的一章增加更多的示例程序。（这个项目Padala正在进行）

· 准备一个演示程序展示文档中所有的示例。同时允许用户通过程序描述展示这些示例。让用户亲自编译并且察看这些程序。一个有对话框的用户界面更好。（这个项目N.N.Ashok正在进行）

· 加入Debug信息，使用 _trace，_tarcemouse 。

· 通过NCURSES库中的函数访问termcap或tremios

· 使用户可以同时在两个终端上工作。

· 在“其它特色”章节（Miscellaneous features）中增加一些东西。

### 1.10 关于著作权

  Copyright (c) 2001 by Pradeep Padala. This document may be distributed under the terms set forth in the LDP license at linuxdoc.org/COPYRIGHT.html.

  This HOWTO is free documentation; you can redistribute it and/or modify it under the terms of the LDP license. This document is distributed in the hope that it will be useful, but without any warranty, without even the implied warranty of merchantability or fitness for a particular purpose. See the LDP license for more details.
回 目 录
下 一 章