ncurses:移动/调整窗口大小后,wgetch无法正确读取

时间:2013-02-15 10:52:52

标签: c++ c cursor ncurses curses

我很难在移动和调整窗口大小后尝试让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

1 个答案:

答案 0 :(得分:1)

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

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

在子窗口周围放一个方框,检查它们是否正在调整大小/正确移动。