• Copyright(C) NCURSES Programming HOWTO

输出修饰

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

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

/*
Compile: gcc main.c -lncurses
*/
#include <ncurses.h>                    /* ncurses.h 已经包含了stdio.h */
#include <stdlib.h>
#include <string.h>//只能读取一个单行的类似包含以下内容的文件:
//adsfadf/*aaaaaaaaa*/ adsfadf
//那么中间的aaaaa就会被加粗显示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("Cannotopen 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 中的宏,它会给出当前光标的位置,需要注意的是我们不能用指针作为参数,只能传递一对整型变量(前文提到过)。函数move()将光标移动到指定位置。(译者注:在这里再次强调——所有这些函数中使用行列坐标的时候是先行后列,即先写y 坐标,再写x坐标。)很多初学者因为数学上的使用习惯而使用了先列后行的方式。(在这里一定要注意!) 这个程序执行的任务非常简单,无需作过多的说明。这个程序对于分析C 语言源代码十分有帮助。你也可以试着将输出文字的颜色改变为其它颜色。也可以将这个程序扩展为分析其它语言程序的工具。

详细介绍

让我们来更多的了解一下输出修饰。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)   前景、背景色设置

最后一个修饰是最吸引人的,它可以设置输出的字符的颜色以及背景的颜色。 我们可以给一段输出同时设定多种修饰。这样可以得到多种结合的效果。如果你想反白显示字符并同时让字符闪烁。只需要在两种修饰属性间加一个“|”字符就可以了:

attron(A_REVERSE | A_BLINK);

attron()函数和attrset()函数之比较

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

attr_get()函数

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

attr_ 类函数

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

wattr_ 类函数

这些函数的作用范围是某一个指定的窗口。而上面的函数只作用在默认的stdscr 上。

chgat() 函数

chgat()函数被列在curs_attr 的man_page 的最末尾。事实上它是一个很有用的函数。它可以在不移动光标位置的情况下修改已输出的字符的修饰效果。它从光标当前位置处开始,以一个整型参数作为修改字符的个数。给这些字符设置某一种修饰属性。 当我们给整型参数赋值为1时,它代表一行修饰。如果你想从当前光标位置使整个一行的输出修饰变为反白显示时,可以这样使用:

chgat(1, A_REVERSE, 0, NULL);

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

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

例:mvchgat()用法示例:

/*
Compile: gcc main.c -lncurses
*/
#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);mvchgat(0, 5, 10, A_BLINK, 1, NULL);mvchgat(0, 35, 10, A_BLINK, 1, NULL);/*
    *第一、二个参数表明了函数开始的位置。
    *第三个参数是被改变修饰的字符的数目,1
    表示一整行。
    *第四个参数是被改变的修饰名。
    *第五个参数是颜色索引。颜色索引已经在init_pair()中被初试化了。
    *如果用0表示不使用颜色。
    *最后一个总是NULL,没什么特殊含义。
    */refresh();getch();endwin();       /* 结束curses 模式*/return 0;
}

ncurses输出修饰:attron(),attroff(),attrset(),attr_get(),attr_,wattr_,chgat(),mvchgat()相关推荐

  1. NCURSES库的使用

    可在http://download.csdn.net/source/942687处下载~~! NCURSES Programming HOWTO 第一章NCURSES 库简介 在使用电传终端作为计算机 ...

  2. ncurses.h 库安装及函数使用

    ncurses库是一个Linux系统下的图形支持的函数库,使用方法可以阅读官方的手册,这里列出了里面许多有用的函数. "ncurses.h" 包含 "stdio.h&qu ...

  3. C#的方法的参数修饰符详解

    方法参数修饰 (啥也没有) 如果参数的修饰是啥也没有,那么其参数传递的方式是值传递,接受方收到的是原始数据的拷贝 out 说明了参数是引用传递. params 可变参,注意了这种修饰符针对的参数一定是 ...

  4. 【C/C++】printf格式化输出-科学计数法形式的浮点数

    C语言printf格式化输出修饰符 printf()的格式符 转换说明 输出 %a, %A 浮点数.十六进制数和p-计数法(C99) %c 一个字符 %d 有符号十进制数 %e, %E 浮点数,e计数 ...

  5. 聊天室-界面-curses

    1. curses 的历史与版本: cureses 最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的. 当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设计 ...

  6. 聊天室之-----界面的问题用到的curses

    1. curses 的历史与版本: cureses 最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的. 当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设计 ...

  7. Linux curses库使用

    相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式的画面也较为美观. 对Programming 有兴趣的 ...

  8. curses编程(一)初识

    curses 的历史与版本:  cureses 最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的. 当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设计的. ...

  9. linux下curses库介绍

    相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式的画面也较为美观. 对Programming 有兴趣的 ...

最新文章

  1. Github工程师为MySQL高可用性采用了新架构
  2. ASP.NET浏览器跨域
  3. MySQL中索引与视图的用法与区别详解
  4. 互联网晚报 | 10月23日 星期六 | 恒大宣布全面实施现楼销售;华为开发者大会2021开幕;家乐福中国首家会员店正式开业...
  5. 线性代数、概率 入门书籍推荐
  6. Jenkins+git 实现代码自动发布
  7. Apache Hive-1.2.1 Manual Patch and Compile
  8. 错误:无法与 SFTP 服务器建立 FTP 连接
  9. Linux下新手基本操作及技巧看图上路
  10. Js对接口数据归类整理
  11. Android可收缩伸展的Expandable分组RecyclerView
  12. 跟涛哥,写短句,不害你
  13. WinPE环境下WinNTSetup使用说明(WIM_ESD系统如何安装)
  14. Spring Cloud Zuul API 网关服务
  15. Ka波段卫星通信终端市场现状及未来发展趋势
  16. 考北航计算机英语考几,往届生跨考北航计算机经验心得
  17. Python+Matplotlib绘制曲线并实现鼠标跟随的放大镜
  18. ORB-SLAM3 细读单目初始化过程(终结篇)
  19. 玩游戏提示计算机内存不足怎么办,win7玩绝地求生提示计算机内存不足怎么办...
  20. RabbitMQ(Java操作工作队列-按劳分配方式)

热门文章

  1. Idea创建一个springboot多模块项目
  2. linux 远程赋值,linux 简单远程复制命令scp参数
  3. R 多变量数据预处理_超长文详解:C语言预处理命令
  4. android json.out,Android 之 json数据的解析(jsonReader)
  5. Hpdl80服务器硬件驱动,hpe proliant dl80 gen9服务器用户指南.pdf
  6. matlab有限差分一维导热,一维导热方程 有限差分法 matlab实现
  7. linux按括号截取字符串,Linux作业4
  8. layui时间选择30分钟为单位_如何集中注意力,不妨试试番茄工作法 | 五色时间管理法...
  9. 车辆出厂信息接口_航测遥感中心“漳州核电智慧工地管理系统平台”通过出厂验收...
  10. 在集设网看世界顶级电影海报欣赏,太美了!