回 目 录
上 一 章 下 一 章

# 第六章：一些类似printw()的输出函数

  我猜你已经再也无法忍受对CURSES那些粗泛的了解了。我们已经通过一些例子，对CURSES系统及其函数有了基本的认识。从现在开始，要正式进入精彩的curses世界了。

  在CURSES函数中有三类打印字符的函数，它们是：

    	addch()类函数集：将单一的字符打印到屏幕上，可以加字符修饰的一类函数。
    	printw()类函数集：和printf()一样的具有格式化输出一类函数。
    	addstr()类函数集：打印字符串的一类函数。

这几类函数可以交替的使用。关键问题是了解某一类函数具体的应用环境。让我们看看这几类函数之间使用的区别。

### 6.1 addch()函数集

  addch()类函数用于在当前光标位置输入单个字符。并将光标移动到下一个位置。你可以使用这个函数打印一个字符。但在大多数情况下，这些函数可以顺便修饰这些字符。后面的章节我们会详细介绍输出修饰。如果一个字符使用了一种修饰效果（比如：粗体、反显……）当CURSES打印这个字符的时候就会应用这种字符修饰效果。

  给字符关联属性有两种方法：

■ 用属性宏（通过"或"运算）修饰单一字符。 这些宏可以在头文件ncurses.h中找到。比如，你想使一个字符变量ch在输出的时候使变量中相应的字符同时以加粗（BOLD）和加下划线（UNDERLINE）的效果输出，你可以使用下面这种方法：
addch(ch | A_BOLD | A_UNDERLINE);

■ 使用像attrset()、attron()、attroff()这样的属性函数属性。 这些函数将在文字修饰一章介绍。简而言之，它们用来修饰当前窗口中的所有内容。一旦设置完成（attrset()函数被调用），则在相应窗口中输出的字符全部都会被修饰。直到关闭修饰（调用attroff()函数）为止。

  CURSES又提供了一些可以在字符模式下作简单图形的特殊字符。你可以用它们绘制表格、或者水平、垂直线条等等。你可以在头文件ncurses.h中找到所有这些特殊字符。这些特殊字符都是以ACS_作为开头声明的宏。

### 6.2 mvaddch(), waddch() 和mvwaddch()函数

  mvaddch()被用来将光标移动到指定位置然后输出字符。因而，下面的函数调用：

    	move(row,col);			/*将光标移动到row所指定的行和col所指定的列。*/
    	addch(ch);

可以用以下的等价函数取代：

    	mvaddch(row,col,ch);

waddch()函数和addch()函数类似。区别在于，waddch()函数将字符输出到指定给定窗口的指定坐标处。（注：addch()将字符输出到标准输出stdscr上。）

  同样的mvwaddch()函数是把光标移动到指定窗口中的指定位置然后输出字符。

  现在，我们了解了一些基本的输出函数。但是，如果我们要输出字符串，像这样一个字符一个字符输出是很烦人的。幸好，CURSES为我们提供了和printf()和puts()一样方便的函数。

### 6.3. printw()函数集

  这些函数的用法很像printf()函数，但提供了可以在屏幕任意位置输出的能力。
6.3.1. printw()函数和mvprintw()函数

  printw()函数的用法绝大部分和printf()函数相同。mvprintw()函数将光标移动到指定的位置然后打印内容。
6.3.2．wprintw() 函数和 mvwprintw函数

  这两个函数和以上两个函数类似。区别在于这两个函数将在指定的窗口输出的内容。而以上两个函数将内容输出到标准输出stdscr上。
6.3.3. vwprintw()函数

  这个函数和vprintf()相似。它用于打印变量表中所对应的变量。
6.3.4.一个简单的printw()函数的使用例子 例3：一个简单的printw()函数的使用例子

    #include <ncurses.h>				/* ncurses.h 已经包含了stdio.h */
    #include <string.h>

    int main()
    {
    	char mesg[]="Just a string";		/* 将要被打印的字符串 */
    	int row,col;				/* 存储行号和列号的变量，用于指定光标位置 */
     	initscr();					/* 进入curses模式 */
     	getmaxyx(stdscr,row,col);		/* 取得stdscr（标准输出设备）的行数和列数 */
     	mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
     							/*在屏幕的正中打印字符串mesg */
     	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()不是一个函数，因此我们不能向它传递指针，只可以传递一对整型变量。

### 6.4 addstr()函数集

  addstr()函数用于输出字符串到指定窗口。这些函数的使用和addch()函数的使用差不多，差别在于输出对象不是单个字符而是字符串。其它的扩展函数分别是mvaddstr()、mvwaddstr()和 waddstr()，它们有着相同的CURSES命名规则和调用方法。（比如mvaddstr() 函数就是分别调用了move()和addstr()函数）这个函数集中还有一个特殊函数addnstr()，这个函数需要一个整型参数。用来打印字符串中和这个整型参数数目相同的字符。如果这个参数是负数，addnstr()将会打印整个字符串。

### 6.5.一些提醒

  所有这些函数中使用坐标的时候是先引入y坐标，再引入x坐标。也就是先行后列，因为计算机字符模式是逐行显示的。很多初学者因为数学上的使用习惯而使用了先x后y的方式。如果你使用了很多行列坐标的操作，想想看将屏幕分割成不同的窗口，然后处理每一个单独的窗口。窗口的详细内容会在窗口一章中介绍。
回 目 录
上 一 章 下 一 章