ncurses 是否可以仅更改前景色?

Is ncurses possible to change only foreground color?

下面的代码只能改变带有颜色的属性。

init_color(1, 255);
init_color(2, 1);
init_pair(1, 1, 2);

attron(COLOR_PAIR(1)); // only change the pair of foreground and background color
addstr("aaa");

attron(A_BOLD); // only change the attribute
addstr("aaa");

attrset(COLOR_PAIR(1)|A_BOLD); // change both

我想知道是否可以只改变前景色,而保留背景色。

attron_fg(BACKGROUND_YELLOW); // only change the foreground color
addstr("aaa");

不,你不能。

Ncurses 基于每个屏幕位置都有一个颜色对的模型。可能的颜色对在一个索引数组中,它是 ncurses 存储在其屏幕表示中的数组索引。所以你只能指定一个颜色对。

此外,由于一切都是基于索引数组,因此更改颜色或颜色对的定义可能会改变以前绘制的字符的显示颜色。

这个模型可能有点烦人,但它是ncurses设计的基础,所以如果你想使用ncurses,你需要适应这个模型。

从历史上看,由于基本相同的原因(内存有限),存在基于相同模型的硬件终端。如今,此类终端大多局限于博物馆,但 ncurses 和其他 unix 终端处理基础设施继续迎合这个世界,在这个世界中,各种外部终端各自呈现出自己独特的设施和局限性。

如今,相同的模型用于补偿各种不同的终端仿真器对终端控制序列的不同实现。但它仍然适用于(或可能适用于)连接到嵌入式设备的控制台。

这是一种解释,既不是借口也不是理由。