我看到这个答案正在研究解决我的问题/sf/answers/588498431/,但是,它仅适用于 stdscreen。我实现了这个:
#include <ncurses.h>
int main(void)
{
int i = 2, height, width;
WINDOW *new;
initscr();
getmaxyx(stdscr, height, width);
new = newwin(height - 2, width - 2, 1, 1);
scrollok(new,TRUE);
while(1)
{
mvwprintw(new, i, 2, "%d - lots and lots of lines flowing down the terminal", i);
++i;
wrefresh(new);
}
endwin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它不滚动。怎么了?
该mvprintw函数首先尝试将光标移动到指定位置,例如,使用wmove。该wmove函数永远不会导致滚动,并且尝试将其移过窗口底线会失败(引用wmove手册):
这些例程在失败时返回 ERR,在成功完成时返回 OK(SVr4 仅指定“ERR 之外的整数值”)。
具体来说,如果窗口指针为空,或者位置在窗口之外,它们将返回错误。
相反,要进行滚动,您必须在窗口底部编写带有换行符(即 ) 的文本。是有用的;依次调用(引用后者的手册):'\n'wprintwwaddch
addch 、 waddch、mvaddch和mvwaddch例程将字符ch放入给定窗口的当前窗口位置,然后前进。它们类似于 stdio(3) 中的putchar。如果预付款在正确的范围内:
...
当前滚动区域的底部,如果 启用了scrollok ,则滚动区域向上滚动一行。
如果ch是制表符、换行符或退格键,则光标会在窗口内适当移动:
...
Newline 执行clrtoeol,然后将光标移动到下一行的窗口左边距,如果在最后一行,则滚动窗口。