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

时间:2016-04-06 21:22:05

标签: ncurses curses

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

#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()总是强制性的吗?文档似乎没有提到这一点。

1 个答案:

答案 0 :(得分:2)

致电getchwgetch(stdscr)相同。当您调用wgetch时,它会刷新它用作参数的窗口。如果您尝试刷新其他窗口(例如my_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;
}

对于更有趣的演示,您可以写入窗口。最好使用子窗口,以便可以滚动它,例如

#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;
}