如何避免ncurses中的stdscr重叠?

时间:2017-02-23 16:06:00

标签: c++ ncurses curses

在我的应用程序中,我有两个 WINDOW 对象,它们将终端窗口一分为二,就像分屏一样。但是当我使用 wprintw()时 我无法在屏幕上看到任何输出。我确定, stdscr 与这两个窗口重叠。我怎样才能避免这种重叠? 也许我需要使用 wrefresh() refresh()?我试过了,但它没有帮助 这是我的代码的简化部分。也许我做错了什么?

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 个答案:

答案 0 :(得分:3)

根据定义,

stdscr涵盖了屏幕,因此它将始终与您创建的任何其他窗口重叠。如果您想拥有多个窗口,解决方案是避免使用stdscr

但您引用stdscr的位置可能并不明显 - 它位于getch()的调用中,也可以读作wgetch(stdscr)。这是一个隐含的wrefresh(stdscr)。用stdscr的(空白)内容覆盖屏幕。

您可以通过将getch()来电更改为wgetch(win1)wgetch(win2)来避免此问题。在这个例子中,你选择哪个窗口并不重要;如果您正在显示输入,则需要使用应显示输入的窗口。

或者,您可以在程序开始时直接致电refresh(),然后再刷新win1win2。然后,只要你从未向stdscr写过任何内容,就可以安全地使用getch(),因为隐式refresh()会在窗口中找不到任何更新来显示。< / p>

答案 1 :(得分: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);