Ncurses:面板的doupdate()和refresh()之间的区别

doupdate()refresh()什么区别?

似乎refresh ()可以替换doupdate() ,但是除非调用refresh()否则不会出现文本。

另外, refresh()刷新所有窗口,还是应该为每个窗口调用refresh()

来自Dan Gookin的程序员NCurses指南 (第513页):

NCurses中的刷新操作由两部分组成:

  • 首先,NCurses获取已经改变或触摸的那些窗口部分,并从窗口数据中写入这些部分
    结构到内存中的虚拟屏幕。
  • 其次,在终端上显示自上次刷新以来触摸的虚拟屏幕的内容。

通过wnoutrefresh()函数执行从窗口数据结构到虚拟屏幕的信息复制。 将虚拟屏幕更新到终端由另一个函数doupdate()处理。 它们一起构成了refresh()或wrefresh()调用的两个组件。

更新多个窗口时使用wnoutrefresh()的优点。 在这种情况下,重复调用wnoutrefresh()后跟一个单独的doupdate()调用比一系列wrefresh()调用更有效,而且它会导致更少的闪烁。

就面板而言,它们是窗口的包装(因此每个面板只有一个窗口)。 调用update_panels() (将窗口按照面板给出的正确堆叠顺序写入虚拟屏幕update_panels()应该足够了,然后doupdate()将输出虚拟屏幕输出到终端。

如果您想进一步划分面板,请考虑使用子窗口。