2017-02-23 143 views
1

在我的應用程序中,我有兩個對象,它們將終端窗口等分爲兩部分,如分屏。但是當我使用wprintw() 我看不到屏幕上的任何輸出。我敢肯定,stdscr重疊這兩個窗口。我怎樣才能避免這種重疊? 也許我需要使用wrefresh()refresh()?我試過了,但沒有幫助。
這是我的代碼的簡化部分。也許我做錯了什麼?如何避免ncurses中的stdscr重疊?

WINDOW *win1 = newwin(10, width, 0, 0); 
WINDOW *win2 = newwin(10, width, width, 0); 

wprintw(win1, "First window: "); 
wprintw(win2, "Second window: "); 

wrefresh(win1); 
wrefresh(win2); 

while((ch = getch()) != KEY_F(2)) {} 

endwin(); 

回答

2

stdscr定義覆蓋屏幕,所以它總是與您共創任何其他窗口重疊。如果你想擁有多個窗口,解決方案是避免使用stdscr

但是您提到的地方stdscr也許並不明顯 - 它在致電getch(),它也可以被讀作wgetch(stdscr)。這確實是一個隱含的wrefresh(stdscr)。它會用stdscr的(空白)內容覆蓋屏幕。

您可以通過將getch()呼叫更改爲wgetch(win1)wgetch(win2)來避免此問題。在這個例子中,你選擇哪個窗口並不重要;如果你正在顯示輸入,你會想使用輸入應該出現的窗口。

或者,您可以在程序開始時在win1win2之前調用refresh()。然後,只要你從不寫任何東西到stdscr,你可以安全地使用getch()儘可能多的,因爲隱含的refresh()將不會在窗口中更新顯示。

0

對不起,浪費你的時間!我自己找到了答案! 下面是代碼:

WINDOW *win1, *win2; 
int maxx, maxy, halfx; 

getmaxyx(stdscr, maxy, maxx); 
halfx = maxx >> 1; 

win1 = newwin(maxy, halfx, 0, 0); 
wgetch(win1, "First window"); 
wrefresh(win1); 

win2 = newwin(maxy, halfx, 0, halfx); 
wgetch(win2, "Second window"); 
wrefresh(win2); 
+0

這和你原來的問題中的代碼不一樣(甚至沒有任何輸入),所以目前還不清楚這是如何解決問題的。 –

+0

當然沒有輸入,因爲我沒有在這裏包括它。但它很好地解決了我的問題 - stdscr沒有重疊。也許我需要更清楚地解釋解決方案。感謝[你](http://stackoverflow.com/users/2906189/william-mcbrine),因爲_getch()_函數默認使用了_stdscr_。 – yutsura