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

问题描述 投票:0回答:2

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

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");
c ncurses curses
2个回答
4
投票

不,你不能。

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

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

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

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

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

这是一种解释,既不是借口也不是辩解


2
投票

你不能直接但可以通过一些努力来完成。最终,您总是需要一个颜色对来指定颜色。您可以获得当前对(背景对为

getbkgd()
,或窗口属性对为
{ attr_get(..., &attr); p=PAIR_INDEX(attr); }
)。

然后使用

pair_content(p, &f, &b)
获取现有对的单独的 f/g 和 b/g 颜色,并使用新的 f/g 和现有的 b/g 使用
init_pair(p, f, b)
创建一个新对。

通过一些编码和缓存,您可以根据 f/g、b/g 颜色进行查找,并确定是否已经存在或需要创建一对。

© www.soinside.com 2019 - 2024. All rights reserved.