9

C ++を使用して、cursesライブラリ(Windows OSの場合はpdcurses)を学習しようとしています。3 つのウィンドウを表示するプログラムがあり、その後、getch() によってキャプチャされたキーの押下に基づいて処理を行う while ループがあります。F1 キーを押すと、ループが終了します。

ただし、3 つのウィンドウすべてを wrefresh() で更新しても、最初にキーを押す前に何も表示されません。while ループがなければ、すべて正常に表示されます。私は多数のテストを行いましたが、 getch() への最初の呼び出しは画面を完全にクリアしますが、その後の呼び出しはそうではありません。

私の質問は次のとおりです。最初は、おそらく getch() が暗黙的な refresh() を呼び出しているのではないかと考えていましたが、それ以降の呼び出しが同じ動作をしないのはなぜですか?

よろしくお願いいたします。

これがコードです。

#include <curses.h>

int main()
{
    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();
    curs_set(0);

    WINDOW *wmap, *wlog, *wlegend;
    int pressed_key;
    int map_cursor_y = 10, map_cursor_x = 32;

    wlog = newwin(5, 65, 0, 15);
    wlegend = newwin(25, 15, 0, 0);
    wmap = newwin(20, 65, 5, 15);

    box(wmap, 0 , 0);
    box(wlog, 0 , 0);
    box(wlegend, 0 , 0);

    mvwprintw(wlog, 1, 1, "this is the log window");
    mvwprintw(wlegend, 1, 1, "legends");
    mvwaddch(wmap, map_cursor_y, map_cursor_x, '@');

    wrefresh(wlog);
    wrefresh(wmap);
    wrefresh(wlegend);

    while ((pressed_key = getch()) != KEY_F(1))
    {
         /* process keys to move the @ cursor (left out because irrelevant) */

         box(wmap, 0 , 0);
         box(wlog, 0 , 0);
         box(wlegend, 0 , 0);
         wrefresh(wmap);
         wrefresh(wlog);
         wrefresh(wlegend);
    }

    endwin();
    return 0;
}
4

3 に答える 3

-1

getch() は画面をクリアしません。キーボードから文字を取得するのを待って、while ループをブロックして、本来の目的を果たすだけです。

だからここにあなたの問題を解決できる何かがあります. curses.h の前に、conio.h をインクルードし、while ループを次のようにします。

do
{
box(wmap, 0 , 0);
 box(wlog, 0 , 0);
 box(wlegend, 0 , 0);
 wrefresh(wmap);
 wrefresh(wlog);
 wrefresh(wlegend);
 if(kbhit())
    pressed_key = getch();
}while (pressed_key  != KEY_F(1));

これは、@Kaz を満足させる別の修正です。今回は、conio.h の代わりに windows.h を使用します。このpressed_key はもう必要ありません。while ループを次のようにします。

do
{
     /* process keys to move the @ cursor (left out because irrelevant) */
     box(wmap, 0 , 0);
     box(wlog, 0 , 0);
     box(wlegend, 0 , 0);
     wrefresh(wmap);
     wrefresh(wlog);
     wrefresh(wlegend);

}
while (!GetAsyncKeyState(VK_F1));

ちなみに、nodelay を使用すると、別の回答で示唆されているように、現在の問題が解決されますが、コンソールで簡単なグラフィックを実行できるという事実を除いて、curses.h の使用はほとんど「役に立たない」ものになります。ライブラリを使用せずに少しのスキルで作成できます。そのメニューで、キーボードで動かされるカーソルの移動などの小さなアニメーションを作成すれば、私の言いたいことがわかるでしょう。基本的に呪いは主にその遅延機能のために使用され、コンソールでより自然に見えるようにするため、特に繰り返しループによって生成される詳細/アニメーションに関してはちらつきません..

于 2013-12-31T06:37:22.190 に答える