6. 输出函数

我想你已经迫不及待地想看到一些实际操作了。回到我们的 curses 函数探索之旅。既然 curses 已经初始化,让我们与世界互动吧。

有三类函数可以用来在屏幕上进行输出。

  1. addch() 类:打印带属性的单个字符

  2. printw() 类:打印类似于 printf() 的格式化输出

  3. addstr() 类:打印字符串

这些函数可以互换使用,使用哪一类函数只是风格问题。让我们详细看看每一个。

6.1. addch() 函数类

这些函数将单个字符放入当前光标位置并移动光标的位置。你可以给出要打印的字符,但它们通常用于打印带有某些属性的字符。属性将在文档后面的 章节 中详细解释。如果字符与属性(粗体、反相视频等)相关联,当 curses 打印字符时,它将以该属性打印。

为了将字符与某些属性组合,你有两个选择

此外,curses提供了一些用于基于字符的图形的特殊字符。你可以绘制表格、水平或垂直线等。你可以在头文件中找到所有可用的字符ncurses.h。尝试查找以ACS_开头的宏。

6.2. mvaddch()、waddch() 和 mvwaddch()

mvaddch()用于将光标移动到给定点,然后打印。因此,调用

    move(row,col);    /* moves the cursor to rowth row and colth column */
    addch(ch);
可以被替换为
    mvaddch(row,col,ch);

waddch()类似于addch(),除了它将字符添加到给定的窗口中。(请注意,addch()将字符添加到窗口stdscr.)

类似地,mvwaddch()函数用于在给定窗口的给定坐标处添加字符。

现在,我们熟悉了基本的输出函数addch()。但是,如果我们想打印一个字符串,逐个字符打印会非常麻烦。幸运的是,ncurses提供了printf-likeputs-like 函数。

6.3. printw() 函数类

这些函数类似于printf(),并增加了在屏幕上的任何位置打印的功能。

6.3.1. printw() 和 mvprintw

这两个函数的工作方式非常像printf(). mvprintw()可以用来将光标移动到某个位置然后打印。如果你想先移动光标,然后使用printw()函数打印,请先使用move(),然后使用printw(),尽管我不明白为什么要避免使用mvprintw(),但你拥有操作的灵活性。

6.3.2. wprintw() 和 mvwprintw

这两个函数与上面两个函数类似,只是它们在作为参数给出的相应窗口中打印。

6.3.3. vwprintw()

此函数类似于vprintf()。当需要打印可变数量的参数时可以使用此函数。

6.3.4. 一个简单的 printw 示例

示例 3. 一个简单的 printw 示例

#include <ncurses.h>			/* ncurses.h includes stdio.h */  
#include <string.h> 
 
int main()
{
 char mesg[]="Just a string";		/* message to be appeared on the screen */
 int row,col;				/* to store the number of rows and *
					 * the number of colums of the screen */
 initscr();				/* start the curses mode */
 getmaxyx(stdscr,row,col);		/* get the number of rows and columns */
 mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
                                	/* print the message at the center of the screen */
 mvprintw(row-2,0,"This screen has %d rows and %d columns\n",row,col);
 printw("Try resizing your window(if possible) and then run this program again");
 refresh();
 getch();
 endwin();

 return 0;
}

上面的程序演示了使用printw有多么容易。你只需提供坐标和要显示在屏幕上的消息,它就会执行你想要的操作。

上面的程序向我们介绍了一个新函数getmaxyx(),这是一个在ncurses.h中定义的宏。它给出给定窗口中的列数和行数。getmaxyx()通过更新给它的变量来实现这一点。由于getmaxyx()不是一个函数,我们不传递指向它的指针,我们只给出两个整数变量。

6.4. addstr() 函数类

addstr()用于将字符串放入给定的窗口。此函数类似于对给定字符串中的每个字符调用一次addch()。这对于所有输出函数都是如此。此系列中还有其他函数,例如mvaddstr()、mvwaddstr()waddstr(),它们遵循 curses 的命名约定。(例如,mvaddstr() 类似于分别调用 move() 然后调用 addstr()。)此系列的另一个函数是 addnstr(),它额外接受一个整数参数(例如 n)。此函数最多将 n 个字符放入屏幕。如果 n 为负数,则将添加整个字符串。

6.5. 一个警示

所有这些函数在其参数中都先接受 y 坐标,然后接受 x 坐标。初学者常犯的错误是以 x,y 的顺序传递。如果你正在进行太多 (y,x) 坐标的操作,请考虑将屏幕划分为窗口并分别操作每个窗口。窗口在 窗口 章节中解释。