2012-11-19 77 views
2

我正在使用ncurses庫編寫控制檯應用程序。我有一個函數是假設寫入窗口緩衝區,然後刷新窗口。在我的測試函數中,我調用窗口函數,併發生了一些事情,因爲程序移動到下一行(getch(),它只是等待我的一個字符),但沒有顯示任何內容。Ncurses窗口不顯示任何東西

這裏是我的功能:

void UI::drawAudience(int audience1, int audience2) 
{ 

    string bar1 = "", bar2 = ""; 

    for (int i; i < BAR_SIZE; i++) 
    { 

     bar1 += (i <= audience1) ? ' ' : '+'; 

     if (i <= audience2) 
      bar2 += '+'; 
    } 

    string audienceName = "Audience Name"; 

    //mvwprintw(audience, 0, 11 - audienceName.size()/2, "%s", audienceName.c_str()); 
    //mvwprintw(audience, 1, 0, "%s|%s", bar1.c_str(), bar2.c_str()); 
    wprintw(audience, "Test"); 

    wrefresh(audience); 
} 

這裏是我的測試代碼:

#include "Tests.h" 
#include <string> 

using namespace std; 

void test() 
{ 
    int y = 1; 

    UI testUI; 

    initscr(); 
    cbreak(); 

    WINDOW* windowTest = newwin(1, 23, 3, 0); 

    wprintw(windowTest, "This is a new window"); 
    wrefresh(windowTest); 

    getch(); 

    clear(); 

    delwin(windowTest); 

    testUI.drawAudience(4,5); 

    getch(); 

    endwin(); 

} 
+0

你可以發佈'class UI'嗎? –

回答

10

編輯:你問題的原因是getch()線。通過調用getch(),程序會將stdscr重新放在頂部。解決方案是使用wgetch(),如(https://stackoverflow.com/a/3808913/2372604)中所述。

我發現的另一個解決方案如下,不幸的是,這可能無法工作,具體取決於您的UI類的實現。嘗試使用以下代碼,將兩條refresh()行註釋掉,然後嘗試再次運行(或兩條)未註釋的行。如果在刷新窗口之前不刷新屏幕,則永遠不會看到窗口。

#include <ncurses.h> 

int main(int argc, char** argv) 
{ 
    initscr(); 
    cbreak(); 
    refresh();  // Important to refresh screen before refresh window 

    WINDOW* windowTest = newwin(1, 23, 3, 0); 
    wprintw(windowTest, "Hello World"); 

    //refresh();  // Refresh here works as well 
    wrefresh(windowTest); 

    getch(); 

    delwin(windowTest); 
    endwin(); 

    return 0; 
}