在 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()?文档似乎没有提到这一点。
调用 getch
与 wgetch(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;
}
我一直在测试 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()?文档似乎没有提到这一点。
调用 getch
与 wgetch(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;
}