2012-05-07 36 views
8

Tôi muốn tạo một menu với ncurses.h và nhiều màu. Ý tôi là một cái gì đó như thế này:ncurses nhiều màu sắc trên màn hình

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

Nhưng nếu tôi sử dụng init_pair(), attron()attroff() màu sắc của toàn bộ màn hình là như nhau, và không giống như tôi đã mong đợi.

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

Có vấn đề gì với mã này?

Cảm ơn mọi câu trả lời!

Trả lời

16

Dưới đây là một phiên bản làm việc:

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

Ghi chú:

  • bạn cần phải gọi start_color() sau initscr() sử dụng màu sắc.
  • bạn phải sử dụng macro COLOR_PAIR để chuyển một cặp màu được phân bổ với init_pair đến attron et al.
  • bạn không thể sử dụng cặp màu 0.
  • bạn chỉ cần gọi refresh() một lần, và chỉ khi bạn muốn đầu ra của bạn để được nhìn thấy tại thời điểm đó, bạn không gọi một chức năng đầu vào như getch() .

This HOWTO rất hữu ích.

+1

thay vì printw, tại sao không thể là mvwprintw ?? –

+0

@jorgesaraiva Có thể vì không cần thiết? Tôi có nghĩa là, chắc chắn, bạn _can_ xác định chính xác những gì cửa sổ để in đến và nơi bạn muốn nó, nhưng tại sao bận tâm với tất cả những gì khi hành vi của 'printw (" ... \ n ")' hiện những gì bạn cần? –

2

Bạn cần phải khởi tạo màu và sử dụng macro COLOR_PAIR.

Cặp màu 0 được dành riêng cho màu mặc định để bạn phải bắt đầu lập chỉ mục tại 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"); 

.... 
Các vấn đề liên quan