📄 ch6.htm
字号:
<html>
<head>
<title>第六章:一些类似printw()的输出函数</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="keywords" content="printw,ncurses,curses,输出函数">
</head>
<body leftmargin=40 bgcolor="#DAFFFF" text="black" link="#0000ff" alink="blue" vlink="#940084">
<br>
<div align="center"><a href="index.htm"><font size="5">
<strong>
回 目 录
</strong>
</font></a></div>
<div align="right">
<font size="5">
<a href="ch5.htm">
<strong>
上 一 章
</strong>
</a>
<a href="ch7.htm">
<strong>
下 一 章
</strong>
</a>
</font>
</div>
<br>
<br>
<br>
<h1 align="center">
第六章:一些类似printw()的输出函数
</h1>
<br>
<br>
<br>
<div align="left">
<font size="4">
<p>
<dd>
我猜你已经再也无法忍受对CURSES那些粗泛的了解了。我们已经通过一些例子,对CURSES系统及其函数有了基本的认识。从现在开始,要正式进入精彩的curses世界了。
</dd>
</p>
<p>
<dd>
在CURSES函数中有三类打印字符的函数,它们是:
</dd>
</p>
<pre>
addch()类函数集:将单一的字符打印到屏幕上,可以加字符修饰的一类函数。
printw()类函数集:和printf()一样的具有格式化输出一类函数。
addstr()类函数集:打印字符串的一类函数。
</pre>
<p>
这几类函数可以交替的使用。关键问题是了解某一类函数具体的应用环境。让我们看看这几类函数之间使用的区别。
</p>
<br>
<h3 align="left">
<a name="#addch">
6.1 addch()函数集
</a>
</h3>
<p>
<dd>
addch()类函数用于在当前光标位置输入单个字符。并将光标移动到下一个位置。你可以使用这个函数打印一个字符。但在大多数情况下,这些函数可以顺便修饰这些字符。后面的章节我们会详细介绍输出修饰。如果一个字符使用了一种修饰效果(比如:粗体、反显……)当CURSES打印这个字符的时候就会应用这种字符修饰效果。
</dd>
</p>
<p>
<dd>
给字符关联属性有两种方法:
</dd>
</p>
<p>
■ <strong>用属性宏(通过"或"运算)修饰单一字符。</strong>
这些宏可以在头文件ncurses.h中找到。比如,你想使一个字符变量ch在输出的时候使变量中相应的字符同时以加粗(BOLD)和加下划线(UNDERLINE)的效果输出,你可以使用下面这种方法:
<br>
<br>
addch(ch | A_BOLD | A_UNDERLINE);
</p>
<p>
<br>
■ <strong>使用像attrset()、attron()、attroff()这样的属性函数属性。</strong>
这些函数将在文字修饰一章介绍。简而言之,它们用来修饰当前窗口中的所有内容。一旦设置完成(attrset()函数被调用),则在相应窗口中输出的字符全部都会被修饰。直到关闭修饰(调用attroff()函数)为止。
</p>
<br>
<p>
<dd>
CURSES又提供了一些可以在字符模式下作简单图形的特殊字符。你可以用它们绘制表格、或者水平、垂直线条等等。你可以在头文件ncurses.h中找到所有这些特殊字符。这些特殊字符都是以ACS_作为开头声明的宏。
</dd>
</p>
<br>
<h3 align="left">
<a name="#mvaddch">
6.2 mvaddch(), waddch() 和mvwaddch()函数
</a>
</h3>
<p>
<dd>
mvaddch()被用来将光标移动到指定位置然后输出字符。因而,下面的函数调用:
</dd>
</p>
<font color="Maroon">
<pre>
move(row,col); /*将光标移动到row所指定的行和col所指定的列。*/
addch(ch);
</pre>
</font>
<p>
可以用以下的等价函数取代:
</p>
<font color="Maroon">
<pre>
mvaddch(row,col,ch);
</pre>
</font>
<p>
waddch()函数和addch()函数类似。区别在于,waddch()函数将字符输出到指定给定窗口的指定坐标处。(注:addch()将字符输出到标准输出stdscr上。)
</p>
<p>
<dd>
同样的mvwaddch()函数是把光标移动到指定窗口中的指定位置然后输出字符。
</dd>
</p>
<p>
<dd>
现在,我们了解了一些基本的输出函数。但是,如果我们要输出字符串,像这样一个字符一个字符输出是很烦人的。幸好,CURSES为我们提供了和printf()和puts()一样方便的函数。
</dd>
</p>
<br>
<h3 align="left">
<a name="#printw">
6.3. printw()函数集
</a>
</h3>
<p>
<dd>
这些函数的用法很像printf()函数,但提供了可以在屏幕任意位置输出的能力。
</dd>
</p>
<br>
<strong>
6.3.1. printw()函数和mvprintw()函数
</strong>
<p>
<dd>
printw()函数的用法绝大部分和printf()函数相同。mvprintw()函数将光标移动到指定的位置然后打印内容。
</dd>
</p>
<strong>
6.3.2.wprintw() 函数和 mvwprintw函数
</strong>
<p>
<dd>
这两个函数和以上两个函数类似。区别在于这两个函数将在指定的窗口输出的内容。而以上两个函数将内容输出到标准输出stdscr上。
</dd>
</p>
<strong>
6.3.3. vwprintw()函数
</strong>
<p><br>
<dd>
这个函数和vprintf()相似。它用于打印变量表中所对应的变量。
</dd>
</p>
<strong>
6.3.4.一个简单的printw()函数的使用例子
</strong>
<strong>
例3:一个简单的printw()函数的使用例子
</strong>
<br>
<font color="Maroon">
<xmp>
#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;
}
</xmp>
</font>
<p>
这个程序示范了printw()类函数的一般用法,你只需要修改其中的行列坐标和要打印的字符串,这个程序就可以做你让它显示的。
</p>
<P>
<dd>
这个程序引入了一个新函数getmaxyx()。这是一个定义在ncurses.h中的宏,它会给出当前终端屏幕的行数和列数。所以,在窗口初始化更改窗口大小数据的时候它也会随着一起改变。getmaxyx()不是一个函数,因此我们不能向它传递指针,只可以传递一对整型变量。
</dd>
</P>
<br>
<h3 align="left">
<a name="#addstr">
6.4 addstr()函数集
</a>
</h3>
<p>
<dd>
addstr()函数用于输出字符串到指定窗口。这些函数的使用和addch()函数的使用差不多,差别在于输出对象不是单个字符而是字符串。其它的扩展函数分别是mvaddstr()、mvwaddstr()和 waddstr(),它们有着相同的CURSES命名规则和调用方法。(比如mvaddstr() 函数就是分别调用了move()和addstr()函数)这个函数集中还有一个特殊函数addnstr(),这个函数需要一个整型参数。用来打印字符串中和这个整型参数数目相同的字符。如果这个参数是负数,addnstr()将会打印整个字符串。
</dd>
</p>
<br>
<h3 align="left">
<a name="#tips">
6.5.一些提醒
</a>
</h3>
<p>
<dd>
所有这些函数中使用坐标的时候是先引入y坐标,再引入x坐标。也就是先行后列,因为计算机字符模式是逐行显示的。很多初学者因为数学上的使用习惯而使用了先x后y的方式。如果你使用了很多行列坐标的操作,想想看将屏幕分割成不同的窗口,然后处理每一个单独的窗口。窗口的详细内容会在窗口一章中介绍。
</dd>
</p>
<br>
<br>
<br>
</font>
</div>
<div align="center"><a href="index.htm"><font size="5">
<strong>
回 目 录
</strong>
</font></a></div>
<div align="right">
<font size="5">
<a href="ch5.htm">
<strong>
上 一 章
</strong>
</a>
<a href="ch7.htm">
<strong>
下 一 章
</strong>
</a>
</font>
</div>
<br>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -