我看到这个答案正在研究解决我的问题https://stackoverflow.com/a/8407120/2570513,但是,它仅适用于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;
}
但它不会滚动。怎么了?
答案 0 :(得分:1)
这是因为你使用mvwprintw
将字符串放在窗口中的某个位置,所以当i
比windowsize大时,它就不会打印在屏幕上。
为了使用scolling,您需要使用wprintw
将文本放在当前光标位置。
#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)
{
wprintw(new, "%d - lots and lots of lines flowing down the terminal\n", i);
++i;
wrefresh(new);
}
endwin();
return 0;
}
如果您想用内容填充窗口,然后使用箭头键向上和向下滚动,您应该看看Pads
答案 1 :(得分:1)
mvprintw
函数首先尝试将光标移动到指示的位置,例如wmove
。 wmove
函数永远不会导致滚动,并且尝试将其移动到窗口的底线失败(引自wmove
手册):
这些例程在成功完成时会在失败时返回ERR并且OK(SVr4仅指定“ERR以外的整数值”)。
具体来说,如果窗口指针,它们会返回错误 为空,或者如果位置在>>窗口之外。
相反,要进行滚动,您必须在窗口底部使用换行符字符(即'\n'
)编写文本。 wprintw
很有用;反过来它调用waddch
(引用后者的手册):
addch , waddch , mvaddch 和 mvwaddch 例程 字符 ch 进入当前窗口的给定窗口 位置,然后提前。它们类似于 stdio中的 putchar (3)。如果预付款位于合适的边缘:
...
在当前滚动区域的底部,如果 启用scrollok,滚动滚动区域 一行。
如果 ch 是制表符,换行符或退格键,则光标会在窗口中正确移动:
...
换行执行clrtoeol,然后将光标移动到。{3}} 窗口左边距在下一行,滚动 窗口如果在最后一行。