我想你已经迫不及待地想看到一些实际操作了。回到我们的 curses 函数探索之旅。既然 curses 已经初始化,让我们与世界互动吧。
有三类函数可以用来在屏幕上进行输出。
addch() 类:打印带属性的单个字符
printw() 类:打印类似于 printf() 的格式化输出
addstr() 类:打印字符串
这些函数可以互换使用,使用哪一类函数只是风格问题。让我们详细看看每一个。
这些函数将单个字符放入当前光标位置并移动光标的位置。你可以给出要打印的字符,但它们通常用于打印带有某些属性的字符。属性将在文档后面的 章节 中详细解释。如果字符与属性(粗体、反相视频等)相关联,当 curses 打印字符时,它将以该属性打印。
为了将字符与某些属性组合,你有两个选择
通过将单个字符与所需的属性宏进行 OR 运算。这些属性宏可以在头文件中找到ncurses.h。例如,你想以粗体和下划线打印字符 ch(char 类型),你可以如下调用 addch()。
addch(ch | A_BOLD | A_UNDERLINE); |
通过使用如下函数attrset()、attron()、attroff()。这些函数在 属性 章节中解释。简而言之,它们操作给定窗口的当前属性。一旦设置,窗口中打印的字符将与属性关联,直到属性被关闭。
此外,curses提供了一些用于基于字符的图形的特殊字符。你可以绘制表格、水平或垂直线等。你可以在头文件中找到所有可用的字符ncurses.h。尝试查找以ACS_开头的宏。
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-like 或puts-like 函数。
这些函数类似于printf(),并增加了在屏幕上的任何位置打印的功能。
这两个函数的工作方式非常像printf(). mvprintw()可以用来将光标移动到某个位置然后打印。如果你想先移动光标,然后使用printw()函数打印,请先使用move(),然后使用printw(),尽管我不明白为什么要避免使用mvprintw(),但你拥有操作的灵活性。
示例 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()不是一个函数,我们不传递指向它的指针,我们只给出两个整数变量。
addstr()用于将字符串放入给定的窗口。此函数类似于对给定字符串中的每个字符调用一次addch()。这对于所有输出函数都是如此。此系列中还有其他函数,例如mvaddstr()、mvwaddstr()和waddstr(),它们遵循 curses 的命名约定。(例如,mvaddstr() 类似于分别调用 move() 然后调用 addstr()。)此系列的另一个函数是 addnstr(),它额外接受一个整数参数(例如 n)。此函数最多将 n 个字符放入屏幕。如果 n 为负数,则将添加整个字符串。
所有这些函数在其参数中都先接受 y 坐标,然后接受 x 坐标。初学者常犯的错误是以 x,y 的顺序传递。如果你正在进行太多 (y,x) 坐标的操作,请考虑将屏幕划分为窗口并分别操作每个窗口。窗口在 窗口 章节中解释。