2012-05-07 11 views
8

Quiero hacer un menú con ncurses.h y más de un color. quiero decir algo como esto:ncurses varios colores en la pantalla

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

Pero si uso init_pair(), attron() y attroff() el color de toda la pantalla es la misma, y ​​no como he esperado.

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

¿Qué pasa con este código?

¡Gracias por cada respuesta!

Respuesta

16

Aquí hay una versión de trabajo:

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

Notas:

  • necesita llamar start_color() después initscr() utilizar el color.
  • tiene que usar la macro COLOR_PAIR para pasar un par de colores asignados con init_pair a attron y otros.
  • no se puede utilizar par 0.
  • de color es suficiente con llamar refresh() una vez, y sólo si desea que su salida se ve en ese punto, y no estás llamando a una función de entrada como getch() .

This HOWTO es muy útil.

+1

en lugar de printw, ¿por qué no puede ser mvwprintw? –

+0

@jorgesaraiva ¿Posiblemente porque no es necesario? Quiero decir, seguro, puedes especificar exactamente a qué ventana imprimir y dónde quieres, pero ¿por qué molestarse con todo eso cuando el comportamiento de 'printw (" ... \ n ")' hace lo que necesitas? –

2

Debe inicializar los colores y usar la macro COLOR_PAIR.

color par 0 está reservado para colores por defecto por lo que tiene que comenzar su indexación en 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"); 

....