2012-11-19 68 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; 
}