以前,只有极少数的哑终端支持彩色显示功能,所以大多数早起的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函数将返回true。然后你需要调用start_color函数,如果该函数成功初始化了颜色显示功能,它将返回OK。
vi color.c
#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);
}
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);
return 0;
}
[root@localhost color]# gcc color.c -o color -l ncurses
[root@localhost color]# ./color
结果如下