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 に答える