2010-09-27 25 views
10

我有一個小的啓動程序,我正在運行,但輸出似乎並沒有顯示,除非我堅持wrefresh()在一個while循環。NCurses刷新

有一些緩衝或繼續嗎?我嘗試了其他refresh函數庫和fflushstddout(我認爲不合理,但值得一試),但似乎沒有任何工作。

第二個小問題:要使getch()非阻塞我們需要撥打nodelay(win,TRUE),對吧?

 

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

我加了下面的代碼: while(ERR == getch()){ wrefresh(win); ++ ctr; } 和輸出看起來不錯,但我仍然不明白爲什麼它最初不顯示沒有循環。 – Tim 2010-09-27 23:55:18

回答

17

您不應該在stdscr和使用newwin()創建的窗口上混合操作。 getch()stdscr上運行,所以這是你的問題。替換

wgetch(win); 

該呼叫(getch()導致stdscr超過你的其他窗口的頂部傾倒,並因爲如此之快,它看起來像從來沒有得到顯示在所有其他窗口)。

+0

你是對的。謝謝一堆!對不起,我還需要再問一次:當你調用一個在窗口上運行的函數時,如果有焦點這樣的事情,它會把焦點設置到那個窗口上? – Tim 2010-09-28 01:23:34

+0

@Tim:硬件光標留在上次刷新的窗口中的光標位置,但這實際上是唯一一種「焦點」。 – caf 2010-09-28 01:28:14

+0

如果你需要獨立的重疊窗口,你應該看看是ncurses的一部分面板庫。 – Craig 2010-10-07 03:34:09

2

這是按設計工作。這樣可以完全重新繪製下一個屏幕,但只有實際更改的部分纔會在刷新時發送到終端。這些日子並不是什麼大不了的事情,但當終端連接速度相對較慢時,這種情況會有很大的變化。

+0

感謝您的回覆。我明白就是這樣,但我什麼都看不到,只是空白的屏幕。如何在不重複調用wrefresh()的情況下最初顯示窗口和文本? – Tim 2010-09-27 23:49:09