2012-05-07 24 views
8

Chcę utworzyć menu z ncurses.h i więcej niż jednym kolorem. mam na myśli coś takiego:ncurses wielu kolorów na ekranie

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

Ale jeśli mogę użyć init_pair(), attron() i attroff() kolor całego ekranu jest taka sama, a nie jak mam się spodziewać.

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

Co jest nie tak z tym kodem?

Dzięki za każdą odpowiedź!

Odpowiedz

16

Oto wersja robocza:

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

Uwagi:

  • trzeba zadzwonić start_color() po initscr() używać kolor. Aby uzyskać parę kolorów przydzieloną z init_pair do attron et al.
  • nie można używać parę kolorów 0.
  • trzeba tylko zadzwonić refresh() raz, i tylko wtedy, gdy chcesz, aby moc być postrzegane w tym punkcie, i nie jesteś wywołanie funkcji wejścia jak getch() .

This HOWTO jest bardzo pomocny.

+1

zamiast printw, dlaczego nie może być mvwprintw ?? –

+0

@jorgesaraiva Prawdopodobnie dlatego, że nie ma takiej potrzeby? Mam na myśli, że możesz określić dokładnie to, do którego okna chcesz drukować i gdzie chcesz, ale po co zawracać sobie głowę tym wszystkim, gdy zachowanie 'printw (" ... \ n ")' robi to, czego potrzebujesz? –

2

Należy zainicjować kolory i użyć makra COLOR_PAIR.

Para kolorów 0 jest zarezerwowana dla domyślnych kolorów, więc należy rozpocząć indeksowanie pod numerem 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"); 

....