4. 初始化

我们现在知道要初始化 curses 系统,必须调用函数 initscr()。在初始化之后,可以调用一些函数来自定义我们的 curses 会话。我们可以要求 curses 系统将终端设置为原始模式,或者初始化颜色,或者初始化鼠标等等。让我们讨论一些通常在 initscr() 之后立即调用的函数;

4.1. 初始化函数

4.2. raw() 和 cbreak()

通常,终端驱动程序会缓冲用户输入的字符,直到遇到换行符或回车符。但是大多数程序要求字符在用户输入后立即可用。以上两个函数用于禁用行缓冲。这两个函数之间的区别在于控制字符(如挂起 (CTRL-Z)、中断和退出 (CTRL-C))传递给程序的方式。在 raw() 模式下,这些字符直接传递给程序,而不会生成信号。在cbreak()模式下,这些控制字符被终端驱动程序解释为任何其他字符。我个人更喜欢使用 raw(),因为我可以对用户的行为进行更大的控制。

4.3. echo() 和 noecho()

这些函数控制是否将用户输入的字符回显到终端。noecho()关闭回显。您可能想要这样做,是为了获得对回显的更多控制,或者在使用 getch() 等函数从用户获取输入时,抑制不必要的回显。大多数交互式程序在noecho()初始化时调用它,并以受控方式进行字符的回显。这使程序员可以灵活地在窗口中的任何位置回显字符,而无需更新当前 (y,x) 坐标。

4.4. keypad()

这是我最喜欢的初始化函数。它启用了对功能键(如 F1、F2、箭头键等)的读取。几乎每个交互式程序都启用此功能,因为箭头键是任何用户界面的主要组成部分。执行keypad(stdscr, TRUE)为常规屏幕 (stdscr) 启用此功能。您将在本文档的后续章节中了解有关按键管理的更多信息。

4.5. halfdelay()

这个函数虽然不常用,但在某些时候很有用。调用 halfdelay() 可以启用半延迟模式,这类似于 cbreak() 模式,因为输入的字符可以立即供程序使用。但是,它会等待 'X' 十分之一秒以获取输入,如果在这段时间内没有输入,则返回 ERR。'X' 是传递给函数 halfdelay() 的超时值。当您想向用户请求输入,如果用户在一定时间内没有响应,我们可以做其他事情时,此函数很有用。一个可能的例子是密码提示符处的超时。

4.6. 其他初始化函数

还有一些在初始化时调用的函数来自定义 curses 行为。它们的使用不如上面提到的那些函数广泛。其中一些将在适当的地方进行解释。

4.7. 示例

让我们编写一个程序,它将阐明这些函数的用法。

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

#include <ncurses.h>

int main()
{	int ch;

	initscr();			/* Start curses mode 		*/
	raw();				/* Line buffering disabled	*/
	keypad(stdscr, TRUE);		/* We get F1, F2 etc..		*/
	noecho();			/* Don't echo() while we do getch */

    	printw("Type any character to see it in bold\n");
	ch = getch();			/* If raw() hadn't been called
					 * we have to press enter before it
					 * gets to the program 		*/
	if(ch == KEY_F(1))		/* Without keypad enabled this will */
		printw("F1 Key pressed");/*  not get to us either	*/
					/* Without noecho() some ugly escape
					 * charachters might have been printed
					 * on screen			*/
	else
	{	printw("The pressed key is ");
		attron(A_BOLD);
		printw("%c", ch);
		attroff(A_BOLD);
	}
	refresh();			/* Print it on to the real screen */
    	getch();			/* Wait for user input */
	endwin();			/* End curses mode		  */

	return 0;
}

这个程序是不言自明的。但我使用了一些尚未解释的函数。函数getch()用于从用户获取字符。它相当于普通的getchar()除了我们可以禁用行缓冲以避免输入后的 <回车>。在 键管理章节 中查找更多关于getch()和读取按键的信息。函数 attron 和 attroff 用于分别打开和关闭某些属性。在示例中,我使用它们以粗体打印字符。这些函数将在后面详细解释。