2

ncurses に慣れようとしていますが、問題があります - KEY_LEFT などの定数が間違っているようです。

たとえば、キーボードの矢印をキャッチしようとしています。次のように単純にする必要があります

while (ch = getch()){
  if (ch == KEY_LEFT)
    foo();
}

しかし、それはうまくいきません。書いてもらったところ、ch左矢印が 68、右矢印が 67、上が 65、下が 66 と書かれています。

それはそれほど問題にはなりませんが、マウス イベントをキャッチしようとするとうまくいきません。ターミナルを左クリックすると、33 から 742 の値が得られます。左上隅をクリックすると最小になり、右下隅をクリックすると最も大きくなります。なんてこったい?

念のため、これが私のメイン全体です

int main(void){
initscr();


start_color();
init_pair(1, COLOR_YELLOW, COLOR_WHITE);
init_pair(2, COLOR_RED, COLOR_RED);

cbreak();

//printw("Hai!\n");
noecho();
int width;
int height;

getmaxyx(stdscr, height, width);

int posx = 30;
int posy = 30;

const char* str = "   ";
const char* hint = "ch = %d";

curs_set(0);


mousemask(BUTTON1_CLICKED, NULL);

unsigned int ch = 0;
while (ch = getch()) {
    attron(COLOR_PAIR(1));
    mvprintw(0, 0, hint, ch);
    mvdelch(posy,posx);
    mvdelch(posy, posx);
    mvdelch(posy, posx);
    switch (ch) {
        case 68:
            if (posx > 0) posx--;
            //mvprintw(1,0,"LEFT");
            break;

        case 67:
            if (posx < width) posx++;
            break;

        case 65:
            if (posy > 0) posy--;
            break;

        case 66:
            if (posy < height) posy++;
            break;

        case KEY_MOUSE:
            MEVENT event;
            if (getmouse(&event)==OK){
                posx = event.x;
                posy = event.y;
            }
    }

    attron(COLOR_PAIR(2));
    mvprintw(posy, posx, str);

    refresh();
}

endwin();

return 0;

}

4

1 に答える 1

2

(ほぼ) いつものように、マニュアルを見ると役立ちます。見てみるとman getch

ファンクション キー curses.h で定義されている次のファンクション キーは、キーパッドが有効になっている場合に getch によって返される可能性があります。これらすべてが必ずしも特定の端末でサポートされているわけではないことに注意してください。

見逃したようです

keypad (stdscr, TRUE);

あなたのプログラムで。少なくとも、投稿したスニペットでは発生しません。

于 2013-03-01T00:39:12.603 に答える