使用curses管理基于文本的屏幕--(六)


颜色

最初,很少有哑终端可以支持颜色,所以大多数早期的curses版本并不会支持颜色。现在,颜色是大家所期望的,而且被ncurses以及大多数现在的curses实现所支持。不幸的,curses的哑屏幕的起源深深影响了API,所以curses使用一种特殊严格的方法来支持颜色,这也反映了早期颜色终端的能力不足。

屏幕上的每一个字符都可以使用许多不同的颜色显示在屏幕上,而不是使用各种不同的背景底色。例如,我们可以在红色的背景上使用绿色来显示文本。

curses中的颜色支持有一些不同,其原因在于每一个字符的颜色并不是独立于其底色而定义的。所以我们必须同时定义前景色与背景色,不要惊奇,这就是所谓的颜色对。

在我们可以使用curses中的颜色功能之间,我们必须检测当前的终端是否支持颜色,然后初始化curses的颜色例程。为了完成这个任务,我们可以使用一个函数对:has_colors与start_color。

#include <curses.h>
bool has_colors(void);
int start_color(void);

如果支持颜色,has_colors就会返回真。然后我们应调用start_color,如果颜色成功的进行了初始化就会返回OK。一旦调用了start_color进行了颜色的初始化,变量COLOR_PAIRS就会被设置为终端可以支持的最大颜色对。通常限制为64颜色对。变是COLORS定义了可用的最大的颜色数量,通常为8。由0开始的数字对于每一个可用的颜色而言起到了唯一ID的作用。

在我们可以将颜色作为属性使用之前,我们必须初始化我们希望使用的颜色对。我们可以使用init_pair函数来完成这个任务。颜色属性可以通过COLOR_PAIR函数来访问。

#include <curses.h>
int init_pair(short pair_number, short foreground, short background);
int COLOR_PAIR(int pair_number);
int pair_content(short pair_number, short *foreground, short *background);

curses.h通常定义了一些以COLOR_开头的基本颜色。另外一个函数,pair_content,可以允许我们取得前面定义的颜色对的信息。

要定义颜色对1,使其背景色为绿色而前景色为红色,我们可以用下面的函数语句:
init_pair(1, COLOR_RED, COLOR_GREEN);

我们可以使用COLOR_PAIR将这个颜色作为一个属性来进行访问:
wattron(window_ptr, COLOR_PAIR(1));

这样就可以将屏幕设置为绿色的背景色以及红色的前景色。

因为COLOR_PAIR是一个属性,所以我们可以将其与其他的属性进行组合。在PC上,我们经常可以通过使用位或操作符组合COLOR_PAIR属性与A_BOLD属性来获得屏幕的亮度:
wattron(window_ptr, COLOR_PAIR(1) | A_BOLD);

下面我们来看一下例子程序color.c中函数:

试验--颜色

1 首先,我们需要检测程序的显示终端是否支持颜色。如果支持,则开始颜色显示。

#include  <unistd.h>
#include  <stdlib.h>
#include  <stdio.h>
#include  <curses.h>
int main()
{
    int i;
    initscr();
    if (!has_colors()) {
         endwin();
         fprintf(stderr, “Error - no color support on this terminal/n”);
         exit(1);
    }
    if (start_color() != OK) {
         endwin();
         fprintf(stderr, “Error - could not initialize colors/n”);
         exit(2);
    }

2 现在我们可以打印出允许的颜色数与颜色对。我们创建七个颜色对并且同时显示。

clear();
mvprintw(5, 5, “There are %d COLORS, and %d COLOR_PAIRS available”,
         COLORS, COLOR_PAIRS);
refresh();
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_RED, COLOR_GREEN);
init_pair(3, COLOR_GREEN, COLOR_RED);
init_pair(4, COLOR_YELLOW, COLOR_BLUE);
init_pair(5, COLOR_BLACK, COLOR_WHITE);
init_pair(6, COLOR_MAGENTA, COLOR_BLUE);
init_pair(7, COLOR_CYAN, COLOR_WHITE);
for (i = 1; i <= 7; i++) {
    attroff(A_BOLD);
    attrset(COLOR_PAIR(i));
    mvprintw(5 + i, 5, “Color pair %d”, i);
    attrset(COLOR_PAIR(i) | A_BOLD);
    mvprintw(5 + i, 25, “Bold color pair %d”, i);
    refresh();
    sleep(1);
}
  endwin();
  exit(EXIT_SUCCESS);
}

重新定义颜色

早期的哑终端一次只可以很显示很少的颜色,但是却允许将激活的颜色设置为可配置的,curses允许使用init_color函数来重新定义颜色。

#include <curses.h>
int init_color(short color_number, short red, short green, short blue);

这允许一个已经存在的颜色可以使用0到1000之间的值进行重新定义。这与定义GIF格式图像文件的颜色有一些类似。
原文地址:https://www.cnblogs.com/dyllove98/p/2461980.html