2014-09-20 9 views
0

그래서, 내 콘솔 응용 프로그램에 몇 가지 색상을 추가하는 데 pdcurses를 사용하고 있지만 문제가 있습니다. 두 번째 창을 만들고 출력 결과를 색칠하려고하면 정상적으로 작동하지만 출력을 stdscr로 출력하려고하면 아무 일도 일어나지 않습니다.stdscr에서 색상이 작동하지 않는 이유는 무엇입니까? (PDCurses)

stdscr이 정상적으로 stdout에 보내는 출력을 받아서 콘솔에 C++ 스타일 인터페이스를 사용할 수 있기 때문에 계속 다른 창으로 덮어두기보다는 stdscr을 계속 사용하고 싶습니다. 출력을 cout으로 보내면 stdscr로 가고, 현재로서는 C++ 인터페이스를 사용하여 pdcurses를 사용하는 유일한 방법입니다. 또한, 다른 라이브러리는 때로 stdout으로 출력을 보내고 stdscr을 사용하면 출력을 잃어 버리지는 않을 것입니다. (lua의 print 기능을 들었습니다.)

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

내가 잘못 뭐하는 거지 : 여기

// 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를 초기화하는 방법입니다

여기에 몇 가지 예제 코드는?

답변

1

표준 출력에 쓰는 것이 stdscr이라고 잘못 가정하고 있습니다. 실제로 이렇게하면 PDCurses를 전혀 사용하지 않는 것처럼 PDCurses를 우회하고 콘솔에 직접 씁니다. stdscr을 포함하여 PDCurses 창에 쓰려면 PDCurses 함수를 사용해야합니다. 사용하지 않는 라이브러리를 stdout으로 보내지 말고 PDCurses를 혼란스럽게하므로이 작업을 수행하지 말아야합니다.

wprintw(stdstc, "\nLe Testing.\n");이 작동하지 않는 분명한 이유는 stdscr 대신 stdstc을 사용했기 때문입니다. 귀하의 게시물에 오타가 있다고 가정하고 프로그램에 실제로 stdscr을 작성했다면 작동 할 것입니다. stdscr을 화면에 실제로 표시하려면 refresh으로 전화 한 것을 기억 했습니까?

+0

정말로 오타였습니다. 감사합니다. printw 및 wprintw를 사용하면 컬러 텍스트가 예상대로 인쇄됩니다. 한 가지 분명한 것은'printw'가 코드의 뒷부분에 오더라도'printw'의 결과가'cout'의 위에 나타난다는 것입니다. 나는 이것이 당신이 말하는 것처럼 단순한 stdout 혼란스러운 pdcurses라고 생각합니다. pdcurses api로 순전히 작동하도록 코드를 수정할 수 있습니다 (최소한이 단계에서). 지금 나는'std :: ostringstream stream; 스트림 << 데이터; printw (stream.str(). c_str());'. –