Ncurses学习经历(四) 输出修饰(对输出数据的修饰,加粗、下划线等)

1.输出修饰

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

#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 中的宏,它会给出当前光标的位置,需要注意的是我们不能用指针作为参数,只
能传递一对整型变量(前文提到过)。函数move()将光标移动到指定位置。(译者注:在这
里再次强调——所有这些函数中使用行列坐标的时候是先行后列,即先写y 坐标,再写x
坐标。)很多初学者因为数学上的使用习惯而使用了先列后行的方式。(在这里一定要注意!)
这个程序执行的任务非常简单,无需作过多的说明。这个程序对于分析C 语言源代码十分
有帮助。你也可以试着将输出文字的颜色改变为其它颜色。也可以将这个程序扩展为分析其

它语言程序的工具。

2. 详细介绍

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

猜你喜欢

转载自blog.csdn.net/zhanganliu/article/details/79938102