2014-09-20 2 views
0

Итак, я использую pdcurses для добавления цвета в консольное приложение, но у меня возникают проблемы. Если я сделаю второе окно и попытаюсь покрасить его вывод, он будет работать нормально, но если я попытаюсь вывести цвет в stdscr, ничего не произойдет.Почему цвета не работают для stdscr? (PDCurses)

Я хочу продолжать использовать stdscr, а не закрывать его другим окном, потому что stdscr получит вывод, который я отправляю на стандартный вывод, позволяя мне использовать интерфейс стиля C++ для консоли. Отправляя вывод в cout, он переходит в stdscr, и в настоящее время это единственный способ использовать интерфейс C++ для pdcurses. Кроме того, другие библиотеки будут иногда отправлять свои данные прямо на stdout, и если я использую stdscr, то вывод не будет потерян (я знаю, что функция lua's print отключена).

Вот некоторые примеры кода:

// This prints a red '>' in the inputLine window properly. // 
wattron(inputLine, A_BOLD | COLOR_PAIR(COLOR_RED)); 
wprintw(inputLine, "\n> "); 
wattroff(inputLine, A_BOLD | COLOR_PAIR(COLOR_RED)); 

// This prints a light grey "Le Testing." to stdscr. Why isn't it red? // 
wattron(stdscr, A_BOLD | COLOR_PAIR(COLOR_RED)); 
cout << "\nLe Testing.\n"; 
wattroff(stdscr, A_BOLD | COLOR_PAIR(COLOR_RED)); 

// This does nothing. I have no idea why. // 
wattron(stdscr, A_BOLD | COLOR_PAIR(COLOR_RED)); 
wprintw(stdscr, "\nLe Testing.\n"); 
wattroff(stdscr, A_BOLD | COLOR_PAIR(COLOR_RED)); 

Вот как я инициализировать pdcurses:

// Open the output log which will mimic stdout. // 
    if (userPath) 
    { 
     string filename = string(userPath) + LOG_FILENAME; 
     log.open(filename.c_str()); 
    } 

     // Initialize the pdCurses screen. // 
    initscr(); 

     // Resize the stdout screen and create a line for input. // 
    resize_window(stdscr, LINES - 1, COLS); 
    inputLine = newwin(1, COLS, LINES - 1, 0); 

     // Initialize colors. // 
    if (has_colors()) 
    { 
     start_color(); 
     for (int i = 1; i <= COLOR_WHITE; ++i) 
     { 
      init_pair(i, i, COLOR_BLACK); 
     } 
    } 
    else 
    { 
     cout << "Terminal cannot print colors.\n"; 
     if (log.is_open()) 
     log << "Terminal cannot print colors.\n"; 
    } 

    scrollok(stdscr, true); 
    scrollok(inputLine, true); 

    leaveok(stdscr, true); 
    leaveok(inputLine, true); 

    nodelay(inputLine, true); 
    cbreak(); 
    noecho(); 
    keypad(inputLine, true); 

Что я делаю неправильно?

ответ

1

Вы ошибочно полагаете, что запись на стандартный вывод будет записываться в stdscr. Фактически это полностью обходит PDCurses и записывается непосредственно на консоль, так же, как если бы вы вообще не использовали PDCurses. Вы должны использовать функцию PDCurses для записи в окна PDCurses, включая stdscr. Вам нужно будет убедить любые библиотеки, которые вы используете, чем отправлять вывод в stdout, чтобы это не произошло, поскольку это смутит PDCurses.

Очевидная причина, по которой wprintw(stdstc, "\nLe Testing.\n"); не работает, это то, что вы использовали stdstc вместо stdscr. Предполагая, что это только опечатка в вашем посте, и вы действительно писали stdscr в своей программе, тогда это должно сработать. Вы помните, как позвонить refresh, чтобы на самом деле были ваши изменения на stdscr, отображаемые на экране?

+0

Действительно, это была опечатка, спасибо. Использование printw и wprintw действительно печатает цветной текст, как ожидалось. Одна вещь, которая меня путает, заключается в том, что вывод 'printw' появляется над' cout', даже когда 'printw' приходит позже в коде; Думаю, это просто путают pdcurses, как вы сказали. Я мог бы изменить свой код, чтобы работать исключительно с pdcurses api (по крайней мере, на этом этапе). Прямо сейчас я использую поток std :: ostringstream; поток << данных; (. Stream.str() c_str()) printw; '. –

Смежные вопросы