回 目 录
上 一 章 下 一 章

# 第四章：初始化

  我们现在知道了：在程序中调用initscr()函数，会让屏幕初始化并进入CURSES模式。还有一些其它的函数可以根据我们自己的方案初始化CURSES。不同的初始化函数可以让屏幕进入不同的显示模式。比如：终端模式（terminal mode）、彩色模式（color mode）、鼠标模式（mouse mode）等等……当然，我们还可以将这些模式混合起来……那么，让我们马上来看看一些经常使用的初始化函数：

### 4.1 raw()和cbreak()函数

  通常情况下，用户输入的字符将被终端程序送入终端的缓冲区。但当用户输入换行符时，终端程序将会中断，同时输出当前的缓冲区内容并启用新行的输出缓冲。但是大多数程序需要当用户输入单个字符时，却希望这些字符能够立即显示在屏幕上。这两个函数就是用来禁用行缓冲（line buffering）。这两个函数所初始化的的模式同样可以用来给程序传送控制字符，比如：挂起（CTRL-Z）、中断或退出（CTRL-C）。区别在于，在raw()函数模式下，这些字符将传送给程序去处理而不作为终端程序处理的信号。在cbreak()模式下，这些控制字符将被认为是终端驱动程序中的控制字符，因而将这些字符传送给终端程序。我比较喜欢使用raw()，那样可以进行更多的控制操作。

### 4.2 echo()和noecho()函数

  这两个函数控制用户输入的键盘回显。就是在运行程序的时候是否将输入的字符出现在屏幕上。比如你的程序在运行时你需要使用控制字符，但是你不想让控制字符出现在屏幕上，就可以使用这两个函数。也就是说当用户调用getch()函数向程序输入数据时，你不想让他输入的字符出现在屏幕上。noecho()函数就可以不让控制字符（比如CTRL-C）出现在屏幕上。大多数的交互式程序要进入控制模式的时候，一般都使用echo()、noecho()函数初始化、关闭键盘回显。这样给了程序员更大的灵活性。

### 4.3 keypad()函数

  这个函数允许使用功能键：F1、F2、方向键等等……几乎所有的交互式程序都使用这个函数。令用户使用方向键控制整个用户界面。使用keypad(stdscr,TURE)就可以在“标准显示设备”（stdscr）上使用这些功能。在以后的章节中将详细讨论如何使用功能键。

### 4.4 halfdelay()函数

  这个函数虽然不经常使用。但有时却非常有用。halfdelay()函数会启用半延时模式（half-delay mode）。和cbreak()函数一样，当程序需要当用户输入这些字符时，它们能够立即显示在屏幕上。但是它要停滞一段限定时间（以0.1秒为单位）等待输入，如果没有有效的输入，返回ERR。给halfdelay()传递一个整型参数（以0.1秒为单位）。它就会按照参数中的时间等待用户输入。一般来说，这个函数在需要等待的输入的程序中可以被用到，如果用户没有及时做出响应，程序就可以去处理其它的事情了。最常见到的应用例子是在输入密码的出超时响应。

### 4.5各种初始化函数

  上面的提到的这些函数可以定制CURSES在初始化后的行为。这些函数不能被广泛使用在程序的各个部分。所以，这些函数的调用要处在整个CURSES会话的开始部分。

### 4.6 一个例子

  让我们写一个程序用来说明这些函数的用法。

例2. 初始化函数用法的示例：

    #include <ncurses.h>

    int main()
    {
    	int ch;

    	initscr();					/* 开始curses模式 */
    	raw();					/* 禁止行缓冲 */
    	keypad(stdscr, TRUE);			/* 开启功能键响应模式 */
    	noecho();					/* 当执行getch()函数的时候关闭键盘回显 */
       	printw("Type any character to see it in bold\n");
    	ch = getch();
    	/* 如果没有调用raw()函数，必须先按下enter键才可以执行下面的程序 */

    	if(ch == KEY_F(1))			/* 如果没有调用keypad（）初始化，将不会执行这条语句 */
    		printw("F1 Key pressed");
    	/* 如果没有使用 noecho() 函数，一些难看的控制字符将会被打印到屏幕上 */

    	else
    	{	printw("The pressed key is ");
    		attron(A_BOLD);
    		printw("%c", ch);
    		attroff(A_BOLD);
    	}
    	refresh();					/* 将缓冲区的内容打印到的显示器上 */
    	getch();					/* 等待用户输入 */
    	endwin();					/* 结束curses模式 */
    	return 0;
    }

  这个程序很简单，不需要太多的说明。但还是有一些前面没有提到的函数。getch()函数用来取得用户输入的信息。它和通常的getchar()函数相似。但是getch（）可以让我们在禁用行缓冲时避免在输入完成后还要按enter键麻烦。在后面的章节中我们也将讨论到这些输入函数。attron()和attroff()函数作为切换开关用来开启和关闭给字符增加一些修饰效果。在这个例子中，它们使显示的字符字体加粗。在后面的部分中我们也将讨论到这些函数。
回 目 录
上 一 章 下 一 章