NCurses刷新

12
我有一个正在运行的小ncurse程序,但输出似乎只有在我将 `wrefresh()` 放入 while 循环中才会显示出来。是否存在某种缓冲机制?我试过库中的其他 `refresh` 函数以及 `fflush` 与 `stddout`(我认为这是没有意义的,但值得一试),但都无效。
另一个小问题:为了使 `getch()` 成为非阻塞的,我们需要调用 `nodelay(win,TRUE)`,对吗?
代码如下:
```c 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(); } ```

我添加了以下代码:while(ERR == getch()) { wrefresh(win); ++ctr; }输出看起来不错,但我仍然不明白为什么它不会在初始显示时循环。 - Tim
2个回答

22

你不应该混合在 stdscr 和使用 newwin() 创建的窗口上执行操作。 getch() 操作是在 stdscr 上执行的,这就是你的问题所在。 用以下代码替换那个调用:

wgetch(win);

(getch() 导致 stdscr 覆盖了其他窗口,由于这发生得非常快,看起来就好像其他窗口根本没有被显示出来一样)。


好的,谢谢!不好意思,我还需要问一个问题:当您调用一个操作窗口的函数时,如果有焦点,它会将焦点设置到该窗口吗? - Tim
@Tim: 硬件光标保留在你上次刷新窗口时光标所在的位置,但这实际上是唯一的“焦点”。 - caf
如果您需要独立的重叠窗口,则应查看ncurses的一部分的面板库。 - Craig

1

这是按设计工作的。它允许您完全重新绘制下一个屏幕,但只有实际更改的部分在刷新时发送到终端。 这在今天并不是很重要,但在终端连接相对较慢时有很大的影响。


谢谢回复。我明白那是情况,但我只看到一个空屏幕。如何在没有重复调用wrefresh()的情况下最初让窗口和文本显示出来? - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接