ncurses 在屏幕上显示多种颜色

Posted

技术标签:

【中文标题】ncurses 在屏幕上显示多种颜色【英文标题】:ncurses multi colors on screen 【发布时间】:2012-05-16 06:15:54 【问题描述】:

我想制作一个带有ncurses.h 和不止一种颜色的菜单。 我的意思是这样的:

┌────────────────────┐
│░░░░░░░░░░░░░░░░░░░░│ <- color 1
│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ <- color 2
└────────────────────┘

但是如果我使用init_pair()attron()attroff(),整个屏幕的颜色是一样的,而不是像我预期的那样。

initscr();

init_pair(0, COLOR_BLACK, COLOR_RED);
init_pair(1, COLOR_BLACK, COLOR_GREEN);

attron(0);
printw("This should be printed in black with a red background!\n");
refresh();

attron(1);
printw("And this in a green background!\n");
refresh()    

sleep(2);

endwin();

这段代码有什么问题?

感谢您的每一个回答!

【问题讨论】:

【参考方案1】:

您需要初始化颜色并使用 COLOR_PAIR 宏。

颜色对0 保留给默认颜色,因此您必须从1 开始索引。

....

initscr();
start_color();

init_pair(1, COLOR_BLACK, COLOR_RED);
init_pair(2, COLOR_BLACK, COLOR_GREEN);

attron(COLOR_PAIR(1));
printw("This should be printed in black with a red background!\n");

....

【讨论】:

【参考方案2】:

这是一个工作版本:

#include <curses.h>

int main(void) 
    initscr();
    start_color();

    init_pair(1, COLOR_BLACK, COLOR_RED);
    init_pair(2, COLOR_BLACK, COLOR_GREEN);

    attron(COLOR_PAIR(1));
    printw("This should be printed in black with a red background!\n");

    attron(COLOR_PAIR(2));
    printw("And this in a green background!\n");
    refresh();

    getch();

    endwin();

注意事项:

您需要在initscr() 之后调用start_color() 才能使用颜色。 您必须使用COLOR_PAIR 宏将分配有init_pair 的颜色对传递给attron 等。 您不能使用颜色对 0。 您只需要调用一次refresh(),并且只有当您希望此时看到您的输出时,并且您不会调用像getch() 这样的输入函数。李>

This HOWTO 很有帮助。

【讨论】:

而不是printw,为什么不能是mvwprintw?? @jorgesaraiva 可能是因为不需要它?我的意思是,当然,您可以 准确指定要打印到哪个窗口以及您想要打印的位置,但是当printw("...\n") 的行为满足您的需要时,为什么还要麻烦这些呢?

以上是关于ncurses 在屏幕上显示多种颜色的主要内容,如果未能解决你的问题,请参考以下文章

Ncurses 和 gdb 屏幕在调试时重叠。所以我想把两个屏幕分开

带有 ncurses 的子窗口

C指针原理(29)-Ncurses-文本终端的图形

为什么颜色在ncurses中不起作用?

Ncurses入门-安装与使用

ncurses程序不会在debian armv7上运行