c - 仅颜色着色不同于文本+颜色着色
问题描述
如果我使用 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
操纵多个角色?
解决方案
Achtype
包含字符和属性数据。将 a 设置chtype
为COLOR_PAIR(COLOR_RED)
,您设置的是属性数据,而不是字符数据,从而有效地将字符数据初始化为0
。
在 ASCII 字符集中,字符代码0
对应 NULL 字符,在 C 中通常用于终止字符串。
现在,意识到它是一个不可打印的字符,因此在文本表示中用两个^@
字符表示: .
addch
和朋友在比您在终端中获得的单纯字段更高的抽象级别上进行操作,他们对字符进行操作,包括不可打印的字符。
来自man curs_addch
:
如果
ch
是任何 [非空白] 控制字符,则以^X
符号表示。添加控制字符后调用winch
不会返回字符本身,而是返回^
控制字符的 -representation。
由于 ncurses 看到COLOR_PAIR(RED)
包含字符 code 0
,因此 ncurses 将其解释为不可打印字符并相应地打印它,两个字段中的一个字符。
推荐阅读
- javascript - 在网页中使用光滑的滑块后出现水平滚动条
- c# - VSIX:IErrorTag 工具提示内容未显示
- java - Spring/Hibernate 数据访问并发问题
- artifactory - 有没有办法使用 API 将存储库从 zip 导入到 jfrog 工件?
- r - 如何在r中获取整数的十进制值
- grails - 如果重命名 id 列,Grails 数据将不会绑定
- python - 在jetson nano上使用python opencv加载相机的问题
- python - ml-workspace 保留已安装的扩展和 pip,而不会因重新启动而丢失
- c# - 哪种 Azure 指标聚合类型返回十进制值?
- java - 使用 java.lang.ref.Cleaner 作为 Object.finalize 的替代品