如何在ncurses中滚动窗口(除了stdscreen)?

时间:2015-04-10 15:36:18

标签: c ncurses tui

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

但它不会滚动。怎么了?

2 个答案:

答案 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函数首先尝试将光标移动到指示的位置,例如wmovewmove函数永远不会导致滚动,并且尝试将其移动到窗口的底线失败(引自wmove手册):

  

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

     

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

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

  

addch waddch mvaddch mvwaddch 例程   字符 ch 进入当前窗口的给定窗口   位置,然后提前。它们类似于   stdio中的 putchar (3)。如果预付款位于合适的边缘:

     

...

     

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

     

如果 ch 是制表符,换行符或退格键,则光标会在窗口中正确移动:

     

...

     

换行执行clrtoeol,然后将光标移动到。{3}}   窗口左边距在下一行,滚动   窗口如果在最后一行。