c++ - 如何避免 ncurses 中的 stdscr 重叠?

标签 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();

最佳答案

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

但是您引用 stdscr 的地方可能并不明显——它在对 getch() 的调用中,也可以读作 wgetch(stdscr)。这会执行隐式 wrefresh(stdscr)。它用 stdscr 的(空白)内容覆盖屏幕。

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

或者,您可以在程序开始时调用 refresh(),然后再刷新 win1win2。然后,只要您从未向 stdscr 写入任何内容,您就可以随心所欲地安全地使用 getch(),因为隐式的 refresh() 会发现窗口中没有任何更新要显示。

关于c++ - 如何避免 ncurses 中的 stdscr 重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42420733/

相关文章:

c++ - 如何有效地找到数组中三元组和的最小差异?

c++ - 如何将子窗口的客户区保存到位图文件中?

c - 使用 ncurses 调整终端大小和滚动问题

python - 简单的 pythoncurses-application 在运行时使用 100% CPU。这是正常的吗?

c++ - 如何将 (*sa_handler)(int) 指针设置为类成员函数? (非静态成员函数的无效使用)

c++ - 如何在 STL 容器和成员函数调用中存储模板化对象

mysql - 找不到 Curses 库

c++ - ncurses可用于Windows吗?

python - 如何删除python curses模块中的子窗口

Ruby Curses 控制回车键