ncurses 可以只改变前景色吗?

eee*_*ngo 0 c curses ncurses

下面的代码只能更改属性并保留颜色。

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
Run Code Online (Sandbox Code Playgroud)

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

attron_fg(BACKGROUND_YELLOW); // only change the foreground color
addstr("aaa");
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 5

不,你不能。

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

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

该模型可能有点烦人,但它是 ncurses 设计的基础,因此如果您想使用 ncurses,您需要适应该模型。

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

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

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