13

我想用一种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();

这段代码有什么问题?

感谢您的每一个回答!

4

2 回答 2

25

这是一个工作版本:

#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();
}

笔记:

  • 您需要调用start_color()initscr()才能使用颜色。
  • 您必须使用COLOR_PAIR宏来传递分配init_pairattron等的颜色对。
  • 您不能使用颜色对 0。
  • 您只需要调用refresh()一次,并且仅当您希望在那时看到您的输出,并且您没有调用像getch().

这个 HOWTO非常有帮助。

于 2012-05-07T19:06:44.897 回答
2

您需要初始化颜色并使用 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");

....
于 2012-05-07T19:06:20.403 回答