第四章:初始化我们现在知道了:在程序中调用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()函数作为切换开关用来开启和关闭字符的修饰效果。在这个例子中,它们使显示的字符字体加粗。在后面的章节中我们也将讨论到这些函数。