首页 > 解决方案 > 仅颜色着色不同于文本+颜色着色

问题描述

如果我使用 ncurses 字符容器对象打印一个字符chtype,只指定一种颜色,例如COLOR_PAIR(SOME_PAIR),我会得到两个颜色字符。正如我所料,使用' ' | COLOR_PAIR(SOME_PAIR),即对一个字符进行 OR-ing ,我只得到一个。

自己试试(用 构建-lncurses):

#include <ncurses.h>

#define RED 1

int main(void)
{
        initscr();
        start_color();
        curs_set(0);
        init_pair(RED, COLOR_RED, COLOR_RED);

        printw("Multiple: ");
        addch(COLOR_PAIR(RED));

        printw("\t\tSingle: ");
        addch(' ' | COLOR_PAIR(RED));

        getch();
        endwin();
}

对我来说它看起来像这样:
程序输出

那里发生了什么?怎么可能addch 操纵多个角色?

标签: cshellgraphicsterminalncurses

解决方案


Achtype包含字符和属性数据。将 a 设置chtypeCOLOR_PAIR(COLOR_RED),您设置的是属性数据,而不是字符数据,从而有效地将字符数据初始化为0

在 ASCII 字符集中,字符代码0对应 NULL 字符,在 C 中通常用于终止字符串。

现在,意识到它是一个不可打印的字符,因此在文本表示中用两个^@字符表示: .

addch和朋友在比您在终端中获得的单纯字段更高的抽象级别上进行操作,他们对字符进行操作,包括不可打印的字符。

来自man curs_addch

如果 ch 是任何 [非空白] 控制字符,则以^X 符号表示。添加控制字符后调用winch不会返回字符本身,而是返回^控制字符的 -representation。

由于 ncurses 看到COLOR_PAIR(RED)包含字符 code 0,因此 ncurses 将其解释为不可打印字符并相应地打印它,两个字段中的一个字符。



推荐阅读