分享
 
 
 

第八章:输出修饰——(NCURSES Programming HOWTO中文版)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

第八章:输出修饰我们已经通过一些例子看到了修饰(Attributes)输出文字的效果。给某些文字加上修饰会使文字更加醒目和美观。在某些程度上也会增加输出信息的可读性。下面这个程序将会把一个C语言的源程序文件的注释部分用使用粗体(BOLD)输出

例5:一个简单的文字修饰的例子:

#include <ncurses.h>

int main(int argc, char *argv[])

{

int ch, prev;

FILE *fp;

int goto_prev = FALSE, y, x;

if(argc != 2)

{ printf("Usage: %s <a c file name>\n", argv[0]);

exit(1);

}

fp = fopen(argv[1], "r"); /* 在这里检测文件是否成功打开 */

if(fp == NULL)

{ perror("Cannot open input file");

exit(1);

}

initscr(); /* 初始化并进入CURSES模式 */

prev = EOF;

while((ch = fgetc(fp)) != EOF)

{

if(prev == '/' && ch == '*') /* 当读到字符"/"和"*"的时候调用开启修饰函数 */

{

attron(A_BOLD); /* 将"/"和"*"及以后输出的文字字体加粗 */

goto_prev = TRUE;

}

if(goto_prev == TRUE) /* 回到"/"和"*"之前开始输出 */

{

getyx(stdscr, y, x);

move(y, x - 1);

printw("%c%c", '/', ch); /* 实际打印内容的部分 */

ch = 'a'; /* 避免下次读取变量错误,这里赋一个任意值*/

goto_prev = FALSE; /* 让这段程序只运行一次 */

}

else printw("%c", ch);

refresh(); /* 将缓冲区的内容刷新到屏幕上 */

if(prev == '*' && ch == '/')

attroff(A_BOLD); /* 当读到字符"*"和"/"的时候调用修饰关闭函数*/

prev = ch;

}

getch();

endwin(); /* 结束并退出Curses模式 */

return 0;

}

不用去理睬那些初始化部分和其它没用的部分。把注意集中在上面的这个while循环体中。这个循环读取文件中每个字符并寻找有"/*"(注释起始处标志)的地方。一旦找到,就会调用attron()函数开始为输出文字加粗加亮。当找到"*/"(注释结束处标志)的地方,就会使用attroff()函数关闭修饰效果。

这个程序介绍了两个十分有用的函数:getyx()和move()。getyx()函数其实是一个定义在ncurses.h中的宏,它会给出当前光标的位置。由于getyx()不是一个通常所指的函数,因此我们不能向它传递指针,只可以传递一对整型变量(前文提到过)。函数move()将光标移动到指定位置。(译者注:在这里再次强调:所有这些函数中使用行列坐标的时候是先行列后列。就是先写y坐标,再写x坐标。)很多初学者因为数学上的使用习惯而使用了先行后列的方式。(在这里一定要注意!)

这个程序执行的任务非常简单,无需作过多的说明。这个程序对于分析C程序十分有帮助。你也可以试着将输出文字的颜色改变为其它颜色。也可以将这个程序扩展为分析其它语言程序的工具。

8.1 详细介绍让我们来更多的了解一下输出修饰。attron()函数、attroff()函数和attrset()函数以及他们的姊妹函数(sister functions)比如attr_get()等等……可以用这些函数创造出生动有趣的显示效果。

attron()函数和attroff()函数分别用来开启(on)或关闭(off)输出修饰。以下这些修饰属性已经定义在头文件CURSES.h中。可以在函数中使用:

A_NORMAL 普通字符输出 (不加亮显示)

A_STANDOUT 终端字符最亮

A_UNDERLINE 下划线

A_REVERSE 字符反白显示

A_BLINK 闪动显示

A_DIM 半亮显示

A_BOLD 加亮加粗

A_PROTECT 保护模式

A_INVIS 空白显示模式

A_ALTCHARSET 字符交替

A_CHARTEXT 字符掩盖

COLOR_PAIR(n) 前景、背景色设置

(注:经过译者试验(见试验程序lst01.c),上述修饰中只有A_NORMAL、A_BLINK、A_DIM、A_INVIS、A_BOLD、A_STANDOUT和A_REVERSE有效。且A_STANDOUT和A_REVERSE具有相同的输出结果。也许是笔者的试验环境问题,也许是笔者的这个测试程序还不完备。还请读者能够在自己所使用的系统上测试,欢迎把测试结果给我。如果你有更好的测试程序,我更加希望你能通过E-mail寄给我。)

最后一个修饰是最吸引人的,它可以设置输出的字符及背景的颜色。颜色的设置将在后面章节详细介绍。

我们可以给一段输出同时设定多种修饰。这样可以得到多种结合的效果。如果你想反白显示字符并同时让字符闪烁。只需要在两种修饰属性间加一个"|"字符就可以了:

attron(A_REVERSE | A_BLINK);

8.2 attron()函数和attrset()函数之比较现在我们该讨论讨论attron()函数和attrset()函数之间的区别了。attrset()为整个窗口设置一种修饰属性。而attron()函数只从被调用的地方开始设置。所以attrset()会覆盖掉你先前为整个窗口设置的任何修饰属性。就像在窗口的开始处开启修饰,在窗口结尾处关闭修饰属性一样。这两种方法为我们管理输出修饰属性提供了更简单、更富有弹性的方法。但是,如果你粗心的话,可能会让整个屏幕变得十分杂乱无章,函数之间的调用会难以管理。这种情况,尤其在某些利用到菜单的程序中出现的十分普遍。所以,事先做好设计,然后按照设计去实施会效果会好得多。你可以经常使用standend()函数关闭所有设置的修饰。这个函数的作用和attrset(A_NORMAL)函数是相同的。

8.3 attr_get() 函数attr_get()函数用来取得当前窗口的修饰属性设置以及背景、文字颜色。虽然这个函数不像上面的那些函数常用。但它却对检测屏幕区域的修饰属性设置很有用。当我们在屏幕输出一些混合的复杂修饰效果时,这个函数可以告诉我们每一个字符关联的修饰。这个函数必须在设置了attrset()或者attron()函数之后使用。

8.4 attr_ 类函数这些函数都有attr_的前缀,比如:attr_set()、attr_on()等等……它们的作用和上面的函数一样,只不过要在调用时添加一定的参数。

8.5 wattr_ 类函数(wattr functions)这些函数的作用范围是某一个指定的窗口。而上面的函数只作用在默认的stdscr上。

8.6 chgat() 函数chgar()函数被列在curs_attr的man_page 的最末尾。事实上它是一个很有用的函数。它可以在不移动光标位置的情况下修改已输出的字符的修饰效果。它从光标当前位置处开始,以一个整型参数作为修改字符的个数。给这些字符设置某一种修饰属性。

当我们整型参数赋值为-1时,它代表一行修饰。如果你想从当前光标位置使整个一行的输出修饰变为反白显示时,可以这样使用:

chgat(-1, A_REVERSE, 0, NULL);

这个函数经常被用来修改已输出的字符的修饰。当然,你也可以根据自己的需要选择要修改的起始点和终止点。

这一类的函数还包括wchgat(), mvchgat()。它们的使用方法和差不多chgat(),只不过wchgat()要指定一个窗口。mvchgat()将光标先移动到指定位置,然后才执行剩下的修饰部分。同样的,chgat()是一个宏,只不过用stdscr替代了指定的窗口。大部分不带w前缀的函数都是以stdscr作为默认窗口的宏。

例6:mvchgat()用法示例:

#include <ncurses.h>

int main(int argc, char *argv[])

{

initscr(); /* 进入 curses 模式 */

start_color(); /* 开启颜色管理功能 */

init_pair(1, COLOR_CYAN, COLOR_BLACK);

printw("A Big string which i didn't care to type fully ");

mvchgat(0, 0, -1, A_BLINK, 1, NULL);

/*

*第一、二个参数表明了函数开始的位置

*第三个参数是被改变修饰的字符的数目,-1表示一整行

*第四个参数是被改变的修饰名

*第五个参数是颜色索引。颜色索引已经在init_pair()中被初试化了

*如果用0表示不使用颜色。

*最后一个总是NULL,没什么特别的意义。

*/

refresh();

getch();

endwin(); /* 结束curses模式 */

return 0;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有