使用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格式图像文件的颜色有一些类似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值