2

在移动和调整窗口大小后,我很难尝试wgetch从窗口读取数据。

输入后,我将窗口向上移动并将其高度也增加 1。然后我清除窗口并将数据写回它。问题是当我这样做wgetch(或mvwgetch)它在我向上移动窗口之前将输入光标定位在上一个位置。

这是我的代码:

#include <ncurses.h>

int main() {
    WINDOW *win=initscr();
    int y,x,i=1;
    getmaxyx(win, y, x);

    //creates a sub windows 1 col high
    WINDOW *child=derwin(win, i, x, y-i, 0); 

    //doc says to touch before refresh
    touchwin(win);

    //print to child
    waddstr(child, "hello");
    wrefresh(child);
    wrefresh(win);

    noecho();
    while(wgetch(child)!='q') {
            ++i;
            mvderwin(child, y-i, 0);
            wresize(child, i, x);
            touchwin(win);

            wclear(child);

            waddstr(child,"hello");
            wrefresh(child);
            wrefresh(win);
    }
    delwin(child);
    delwin(win);
    endwin();
}

这里“hello”这个词确实按预期向上移动,但是输入光标在错误的位置。使用mvwgetch仍然会导致同样的问题。cbreak()noecho()而且scrollok(child)似乎也没有帮助。

谢谢

编辑:更新版本更好地显示问题http://liveworkspace.org/code/31DruQ $0

4

1 回答 1

1

您必须捕获 SIGWINCH,该信号在您调整终端大小时发送。执行 endwin()、refresh(),然后重新绘制窗口。光标位置是相对于窗口的,而不是实际的终端大小。窗口不会自动调整大小。

编辑:对,你实际上是在调整窗口的大小,而不是终端。在这种情况下,首先,对子 LAST 进行一次刷新,屏幕上显示的光标是最后一次刷新的光标。

在您的子窗口周围放一个框,并检查它们实际上是否正确调整大小/移动。

于 2013-02-15T11:55:30.707 回答