5

我看到这个答案正在研究以解决我的问题https://stackoverflow.com/a/8407120/2570513,但是,它仅适用于标准屏幕。我实现了这个:

#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;
}

但它不滚动。怎么了?

4

2 回答 2

3

那是因为您使用 将字符串放在窗口中的某个位置mvwprintw,所以当i它大于窗口大小时,它就不会打印在屏幕上。

为了使用 scolling,您需要使用wprintwwhich 将文本放在当前光标位置。

#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

于 2015-04-10T21:26:04.850 回答
1

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

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

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

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

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

...

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

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

...

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

于 2015-04-11T00:55:11.430 回答