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

时间:2016-08-29 11:17:43

标签: c++ c ncurses curses

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

  

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

...

  

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

...

  

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

2 个答案:

答案 0 :(得分:7)

"OpenBSD manpages"ncurses。键绑定是无关紧要的。
您已经问过三个特征:

  1. clearok()
  2. redrawwin()
  3. wrefresh()以curscr作为参数?
  4. 但那些是不同的:

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

    对于它的价值, curscr 功能早于ncurses,但我必须指向source-code才能显示。虽然在changelog entry from 1995中提到了这一点:

      

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

答案 1 :(得分:0)

通常在按下Ctrl + L或Ctrl + R时发生的事情是你的shell或正在使用的程序的问题,在这种情况下,程序将发送一个字符序列,你的终端将在(终端)清除你的时候插入屏幕。

如何获得此序列:

#include <curses.h>
#include <term.h>
#include <termios.h>
#include <sys/ioctl.h>

void init_term(void)
{
  static struct termios term_new;

  setupterm(NULL, 1, NULL);
  ioctl(0, TCGETS, &term_new);
}


int             main(void)
{
  // init the ncurses
  init_term();
  // get the sequence for "clear" command then print it 
  printf("%s", tigetstr("clear"));
  // and flush the buffer
  fflush(stdout);
  return (0);
}