【发布时间】:2012-01-08 12:07:16
【问题描述】:
我正在开发一个使用 5 个窗口的 ncurses 应用程序:
- 状态栏窗口 - 1 X COLS 位于屏幕底部。
- 标题栏窗口 - 1 X COLS 位于屏幕顶部。
- 3 个内容窗口 - LINES - 2 X COLS,位于状态栏和标题栏之间。
请注意,有 3 个内容窗口,它们完全相互重叠。我正在手动决定要重绘哪个。标题栏和状态栏窗口不与任何其他窗口重叠。
一个用例是用户使用其中一个内容窗口中的菜单选择要上传到网络守护程序的文件。选择文件后,状态栏充当粗略的进度条,绘制一些散列以指示文件已上传多远。
这归结为使用:
- 清除(状态);
- mvwprintw(状态, ...);
- 刷新(状态);
这可行,但由于某种原因导致整个屏幕被重绘,导致可怕的闪烁混乱。阅读手册后,我不明白为什么会这样;只要状态栏不与任何其他窗口重叠,重绘状态栏应该不会导致整个屏幕重绘?
我是对的,还是我误解了?有没有办法防止这种情况发生?
代码在这里: https://github.com/vext01/hgd/blob/master/nchgdc.c#L812
请注意,代码尚未完成,缺乏润色 =)
我的 ncurses 实现是 OpenBSD 的。
【问题讨论】:
-
你能写一个很短的独立程序来演示这种行为吗?你在哪个终端运行这个?请注意,某些终端的功能可能有限,因此需要重新绘制整个屏幕,而其他终端可能不会。
-
这样做我看到了罪犯。 wclear() 似乎会导致整个屏幕更新!没有它,我没有闪烁。为什么是这样? gist.github.com/1605660