2017-02-23 107 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