curses颜色操作
start_color,
init_pair,
init_color,
has_colors,
can_change_color,
color_content,
pair_content,
COLOR_PAIR
Synopsis
int start_color(void);
int init_pair(short pair, short f, short b);
int init_color(short color, short r, short g, short b);
bool has_colors(void);
bool can_change_color(void);
int color_content(short color, short *r, short *g, short *b);
int pair_content(short pair, short *f, short *b);
概观
curses支持具有该功能的终端上的颜色属性。
要使用这些例程,必须在initscr之后调用start_color。
颜色总是成对使用(称为颜色对)。
颜色对由前景色(用于字符)和背景色(用于显示字符的空白字段)组成。
程序员使用例程init_pair初始化颜色对。
初始化之后,COLOR_PAIR(n)(在<curses.h>中定义的宏)可以用作新的视频属性。
如果终端能够重新定义颜色,程序员可以使用例程init_color来更改颜色的定义。
例程 has_colors和can_change_color返回TRUE或FALSE,具体取决于终端是否具有颜色功能以及程序员是否可以更改颜色。
例程color_content允许程序员以初始化颜色提取红色,绿色和蓝色分量。
例程pair_content允许程序员找出当前如何定义给定颜色对。
常规描述
该start_color程序不需要参数。
如果程序员想要使用颜色,并且在调用任何其他颜色操作例程之前,必须调用它。
在initscr之后立即调用此例程是一种好习惯。
start_color初始化八种基本颜色(黑色,红色,绿色,黄色,蓝色,洋红色,青色和白色)和两个全局变量COLORS和COLOR_PAIRS(分别定义终端可以支持的最大颜色数和颜色对)。
它还将终端上的颜色恢复为刚刚打开终端时的值。
所述init_pair例程改变颜色对的定义中。
它需要三个参数:要更改的颜色对的编号,前景颜色编号和背景颜色编号。
第一个参数的值必须介于1和COLOR_PAIRS-1之间,除非使用默认颜色,调整上限以允许在前景和/或背景中使用默认颜色的额外对。
第二个和第三个参数的值必须介于0和COLORS之间。
假设颜色对0在黑色上是白色的,但实际上是在初始化颜色之前终端实现的任何东西。
它不能被应用程序修改。
如果先前已初始化颜色对,则刷新屏幕并将所有出现的颜色对更改为新定义。
作为扩展,ncurses的允许用户通过所述设置的颜色对0 assume_default_colors例程,或指定使用的默认颜色(颜色数 -1)如果首先调用use_default_colors例程。
该init_color常规改变颜色的定义。
它需要四个参数:要更改的颜色数,后跟三个RGB值(红色,绿色和蓝色组件的数量)。
第一个参数的值必须介于0和COLORS之间。
最后三个参数中的每一个必须是介于0和1000之间的值。
使用init_color时,屏幕上所有出现的颜色都会立即更改为新定义。
该has_colors程序不需要参数。
如果终端可以操作颜色,则返回TRUE ; 否则,它返回FALSE。
该例程有助于编写与终端无关的程序。
例如,程序员可以使用它来决定是使用颜色还是其他视频属性。
该can_change_color程序不需要参数。
如果终端支持颜色并且可以更改其定义,则返回TRUE ; 另外,它返回FALSE。
该例程有助于编写与终端无关的程序。
该color_content例行为程序员提供了一种方法来找到一个颜色的红,绿,蓝(RGB)分量的强度。
它需要四个参数:颜色编号和short的三个地址,用于存储有关给定颜色中红色,绿色和蓝色分量的信息。
第一个参数的值必须介于0和COLORS之间。
存储在最后三个参数指向的地址处的值介于0(无组件)和1000(组件的最大数量)之间。
该pair_content程序允许程序员找出给定的颜色对包括什么颜色。
它需要三个参数:颜色对数,以及用于存储前景和背景颜色数的两个短地址。
第一个参数的值必须介于1和 COLOR_PAIRS-1之间。
存储在第二个和第三个参数指向的地址处的值介于0和COLORS之间。
颜色
在<curses.h>中定义了以下宏。这些是默认颜色。curses还假设COLOR_BLACK是所有终端的默认背景颜色。
COLOR_BLACK
COLOR_RED
COLOR_GREEN
COLOR_YELLOW
COLOR_BLUE
COLOR_MAGENTA
COLOR_CYAN
COLOR_WHITE
回报价值
例程can_change_color()和has_colors()返回TRUE或FALSE。
所有其他例程在失败时返回整数ERR,并且成功完成后,OK(SVr4仅指定“除ERR之外的整数值”)。
X / Open定义没有错误条件。
此实现将在尝试使用0到COLORS-1范围之外的颜色值时返回ERR(默认颜色扩展名除外),或使用0到COLOR_PAIR-1范围之外的颜色对。
init_color中使用的颜色值必须在0到1000的范围内。
如果终端尚未初始化,则会从所有函数返回错误。
如果未调用start_color,则会从init_pair等辅助函数返回错误。
init_color
如果终端不支持此功能,则返回错误,例如,如果终端描述中不存在initialize_color功能。
start_color
返回错误如果无法分配颜色表。
笔记
在ncurses实现中,每个屏幕都有一个单独的颜色激活标记,调色板,颜色对表以及相关的COLORS和COLOR_PAIRS计数; 该start_color功能只影响当前屏幕。
SVr4 / XSI接口并没有真正考虑到这一点,历史实现可能使用单个共享调色板。
请注意,通过颜色对设置隐式背景颜色仅影响字符写入操作明确触摸的字符单元格。
要更改通过擦除或滚动操作消除窗口部分时使用的背景颜色。
有关VGA兼容图形的386和486机器有几个注意事项:
COLOR_YELLOW实际上是棕色的。要变黄,请使用COLOR_YELLOW并结合A_BOLD属性。
理论上,A_BLINK属性应该使背景变亮。
这通常无法工作,甚至一些它主要工作的卡(如天堂和兼容机)在你试图设置明亮的“黄色”背景时会做错事(你会得到一个闪烁的黄色前景)。
颜色RGB值无法设置。
可移植性
此实现满足XSI Curses的COLORS和COLOR_PAIRS的最小最大值。
该init_pair例程接受前景色和背景色,支持的负值use_default_colors扩展名,但只有当程序被调用第一。
可以使用assume_default_colors扩展来修改COLOR_BLACK是所有终端的默认背景颜色的假设。
此实现检查指针,例如,color_content和pair_content返回的值,并在null时将它们视为可选参数。