我一直在测试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()总是强制性的吗?文档似乎没有提到这一点。
答案 0 :(得分:2)
致电getch
与wgetch(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;
}