2010-09-27 25 views
10

Ich habe ein kleines Ncurs-Programm, das ich laufe, aber die Ausgabe scheint nicht aufzutreten, es sei denn, ich stecke die wrefresh() in eine While-Schleife.NCurses Refresh

Gibt es eine Pufferung oder etwas? Ich versuchte andere refresh Funktionen in der Bibliothek und fflush mit stddout (was ich glaube nicht, macht Sinn, aber einen Versuch wert), aber nichts scheint zu funktionieren.

Eine zweite kleine Frage: getch() nicht blockierend machen wir müssen anrufen nodelay(win,TRUE), richtig?

 

void main() 
{ 
     initscr(); 
     start_color(); 
     init_pair(1,COLOR_YELLOW,COLOR_CYAN); 
     WINDOW *win = newwin(10,10,1,1); 
     wbkgd(win,COLOR_PAIR(1)); 
     wprintw(win,"Hello, World."); 
     wrefresh(win); 
     getch(); 
     delwin(win); 
     endwin(); 
} 
 
+0

Ich habe den folgenden Code hinzugefügt: while (ERR == getch()) { wrefresh (win); ++ ctr; } und die Ausgabe sieht gut aus, aber ich verstehe immer noch nicht, warum es zunächst ohne Schleife nicht angezeigt wird. – Tim

Antwort

17

Sie dürfen keine Operationen an stdscr und Fenstern, die mit erstellt wurden, mischen. getch() arbeitet auf stdscr, das ist also dein Problem. Ersetzen Sie diesen Anruf mit

wgetch(win); 

(getch() verursacht stdscr über die Oberseite des anderen Fenster geworfen zu werden, und weil das so schnell passiert, sieht es aus wie das andere Fenster überhaupt nicht angezeigt wurde).

+0

Richtig du bist. Vielen Dank! Entschuldigung, aber ich muss noch eine Frage stellen: Wenn Sie eine Funktion aufrufen, die auf einem Fenster arbeitet, setzt sie den Fokus auf dieses Fenster, wenn es so etwas wie Fokus gibt? – Tim

+0

@Tim: Der Hardware-Cursor bleibt an der Position des Cursors im Fenster, das Sie zuletzt aktualisiert haben, aber das ist wirklich die einzige Art von "Fokus". – caf

+0

Wenn Sie unabhängige überlappende Fenster benötigen, sollten Sie sich die Panels-Bibliothek ansehen, die Teil von ncurses ist. – Craig

2

Das funktioniert wie geplant. Dadurch können Sie den nächsten Bildschirm vollständig neu zeichnen, aber nur die Teile, die tatsächlich geändert wurden, werden zum Aktualisierungszeitpunkt an das Terminal gesendet. Dies ist heutzutage keine so große Sache, machte aber einen großen Unterschied, wenn Terminalverbindungen relativ langsam waren.

+0

Danke für die Antwort. Ich verstehe, dass das der Fall ist, aber ich sehe nichts als einen leeren Bildschirm. Wie bekomme ich das Fenster und den Text * am Anfang * ohne wiederholt wrefresh() aufzurufen? – Tim