我很难在移动和调整窗口大小后尝试让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
答案 0 :(得分:1)
您必须捕获SIGWINCH,当您调整终端大小时会发送该信号。执行endwin(),刷新(),然后重新绘制窗口。光标位置是相对于窗口的,而不是实际的终端大小。窗口不会自动调整大小。
编辑:对,你实际上是在调整窗口大小,而不是终端。在这种情况下,首先,在子节点上做一个wrefresh,屏幕上显示的光标是最后一次刷新的光标。
在子窗口周围放一个方框,检查它们是否正在调整大小/正确移动。