在 ncurses 中使用 windows 时,是否需要至少调用一次 refresh()?

Does refresh() need to be called at least once, when using windows in ncurses?

我一直在测试 ncurses,我尝试使用 windows 编写一个简单的代码,通过阅读教程中的代码,在我看来,如果只对一个进行更改,调用 wrefresh() 就足够了window。所以我尝试了下面的代码,但是它不起作用,有人知道为什么吗?

#include <ncurses.h>

int main (void) {
    int ch;

    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();

    WINDOW *my_window = newwin(10, 20, 3, 4);
    box(my_window, 0, 0);
    wrefresh(my_window);

    while ((ch=getch()) != 'q');
    endwin();
    return 0;
}

如果我在 wrefresh() 之前添加对 refresh() 的额外调用,一切正常。

#include <ncurses.h>

int main (void) {
    int ch;

    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();

    WINDOW *my_window = newwin(10, 20, 3, 4);
    box(my_window, 0, 0);
    refresh();
    wrefresh(my_window);

    while ((ch=getch()) != 'q');
    endwin();
    return 0;
}

我试过好几种方法,例如在wrefresh() 之后调用refresh() 也不起作用,仅使用refresh() 也不起作用。此外,本指南中的 example 7 显示在调用 refresh() 一次后,只需在 while 循环中调用 wrefresh() 即可。

是否总是必须在 initscr() 之后至少调用一次 refresh()?文档似乎没有提到这一点。

调用 getchwgetch(stdscr) 相同。当您调用 wgetch 时,它会刷新用作参数的 window。如果您尝试刷新不同的 window(例如 my_window),那么您应该使用 that window 作为参数。

在您的示例中,没有任何有趣的内容写入 stdscr。所以你可以省略普通的 refresh() 调用。

经过这些改动,程序是

#include <ncurses.h>

int main (void) {
    int ch;

    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();

    WINDOW *my_window = newwin(10, 20, 3, 4);
    box(my_window, 0, 0);

    while ((ch=wgetch(my_window)) != 'q');
    endwin();
    return 0;
}

更有趣的demo,可以写入window。最好用 subwindow 来完成,这样它就可以滚动,例如

#include <ncurses.h>

int main (void) {
    WINDOW *my_window;
    WINDOW *my_scroller;
    int ch;

    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();

    if ((my_window = newwin(10, 20, 3, 4)) != 0) {
        box(my_window, 0, 0);
        wrefresh(my_window);
        if ((my_scroller = derwin(my_window, 8, 18, 1, 1)) != 0) {
            scrollok(my_scroller, TRUE);
            while ((ch=wgetch(my_scroller)) != 'q') {
                wprintw(my_scroller, "%#x - %s\n", ch, keyname(ch));
            }
        }
    }
    endwin();
    return 0;
}