如何在 ncurses 中滚动窗口(标准屏幕除外)?

Mar*_*Gil 5 c tui ncurses

我看到这个答案正在研究解决我的问题/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)

但它不滚动。怎么了?

Tho*_*key 1

mvprintw函数首先尝试将光标移动到指定位置,例如,使用wmove。该wmove函数永远不会导致滚动,并且尝试将其移过窗口底线会失败(引用wmove手册):

这些例程在失败时返回 ERR,在成功完成时返回 OK(SVr4 仅指定“ERR 之外的整数值”)。

具体来说,如果窗口指针为空,或者位置在窗口之外,它们将返回错误。

相反,要进行滚动,您必须在窗口底部编写带有换行符(即 ) 文本。是有用的;依次调用(引用后者的手册):'\n'wprintwwaddch

addch 、 waddchmvaddchmvwaddch例程将字符ch放入给定窗口当前窗口位置,然后前进。它们类似于 stdio(3) 中的putchar。如果预付款在正确的范围内:

...

当前滚动区域的底部,如果 启用了scrollok ,则滚动区域向上滚动一行。

如果ch是制表符、换行符或退格键,则光标会在窗口内适当移动:

...

Newline 执行clrtoeol,然后将光标移动到下一行的窗口左边距,如果在最后一行,则滚动窗口。