重绘整个屏幕的正确方法?

pot*_*bie 2 c c++ curses ncurses

我不明白当用户按下Ctrl-L或Ctrl-R时用于重绘屏幕的功能.什么是两者的区别clearok(),redrawwin()或wrefresh()与curscr作为参数?从OpenBSD手册页:

如果以TRUE作为参数调用clearok,则使用此窗口调用wrefresh将完全清除屏幕并从头开始重绘整个屏幕.当屏幕内容不确定时,或者在某些情况下获得更令人愉悦的视觉效果时,这非常有用.如果clearok的win参数是全局变量curscr,则使用任何窗口调用wrefresh会导致屏幕被清除并从头开始重新绘制.

...

如果wrefresh的win参数是全局变量curscr,则会立即清除屏幕并从头开始重新绘制.

...

wredrawln例程指示诅咒某些屏幕行已损坏,应该在将任何内容写入之前将其丢弃.它触及指示的线条(标记它们已更改).例程redrawwin()触及整个窗口.

Tho*_*key 7

该"手册页OpenBSD的"是ncurses的.密钥绑定无关紧要.
您已经问过三个功能:

  1. clearok(),
  2. redrawwin(),或
  3. 用curscr作为参数的wrefresh()?

但那些是不同的:

  • 有clearok(),你是不是告诉你已经忘记了在屏幕上什么诅咒,但说这是最好清除它(和诅咒会做到这一点),但
  • redrawwin()不是重新绘制整个屏幕,而是一个窗口.如果您的应用程序模仿面板库,使某些窗口重叠并希望将一个模糊的窗口"提升"在其他窗口之上,则您的应用程序可能会这样做.最后,
  • 刷新curscr明确地告诉诅咒绕过印刷的正常顺序到窗口中,或到stdscr,然后从应用更改stdscr到newscr,和之间施加的差异newscr和对.就诅咒而言,有什么东西放在物理屏幕上.因此,当您修改时,curses会在要求刷新时立即更新物理屏幕.curscr curscrcurscrcurscr

对于它的价值,该curscr功能早于ncurses,虽然我必须指向源代码来显示.从1995年的这个更改日志条目中提到了它:

src/curses/resizwin.c:刷新curscr以强制在ncurses中更新屏幕