Не удается получить клавиши со стрелками для перемещения курсора в проклятиях (C) - PullRequest
0 голосов
/ 29 апреля 2018

Ниже мой код. У меня есть главное окно с двумя вариантами, которые я хочу, чтобы пользователь мог переключаться назад и вперед, просто используя KEY_LEFT и KEY_RIGHT. Я установил его простым способом прямо сейчас (или так я думал), просто переместив курсор прямо на один из вариантов.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <curses.h>
#include <time.h>

int main()
{
    int j = 0, highlight = 0, choice;
    int x = 0, y = 0;

    initscr();
    noecho();
    cbreak();

    WINDOW * mainwin = newwin(20, 52, 0, 0);
    refresh();

    while (1)
    {
        keypad(mainwin, TRUE);
        box(mainwin, 0, 0);
        mvwprintw(mainwin, 1, 1, "             L I C E N S E    P L A T E");
        mvwprintw(mainwin, 3, 2, "RAW ADDITION                          COMPARISON");
        wmove(mainwin, 3, 2);
        wattron(mainwin, A_BLINK);
        refresh();
        wrefresh(mainwin);

        choice = wgetch(mainwin);

       switch(choice)
       {
            case KEY_LEFT:
                wmove(mainwin, 3, 2);
                wrefresh(mainwin);

            case KEY_RIGHT:
                wmove(mainwin, 3, 26);
                wrefresh(mainwin);

            default:
                wmove(mainwin, 3, 2);
                wattroff(mainwin, A_BLINK);
                wrefresh(mainwin);

        }

        if (choice == '\n')
        {
            if (highlight == 0) // RAW ADDITION
            {
                char lp[8];
                char num[10];
                int n;
                WINDOW * win = subwin(mainwin, 30, 45, 1, 1);
                refresh();

                box(win, 1, 1);
                mvwprintw(win, 2, 2, "RAW ADDITION");
                mvwprintw(win, 3, 2, "Enter a license plate and an integer.");
                mvwprintw(win, 5, 3, "._________.          ._____________.");
                mvwprintw(win, 6, 3, "|         |          |             |");
                mvwprintw(win, 7, 3, "'---------'          '-------------'");

                wmove(win, 6, 5);
                wrefresh(win);

                mvwgetnstr(win, 6, 5, lp, 7);
                wrefresh(win);

                wmove(win, 6, 26);
                wrefresh(win);

                mvwgetnstr(win, 6, 26, num, 10);
                wrefresh(win);

                n = atoi(num);
            }
            else // COMPARISON
            {

            }
        }

        if (toupper(choice) == 'Q')
            break;
        else if (choice == KEY_LEFT)
        {
            wmove(mainwin, 3, 2);
            wrefresh(mainwin);
        }
        else if (choice == KEY_RIGHT)
        {
            wmove(mainwin, 3, 26);
            wrefresh(mainwin);
        }
    }

    endwin();
    exit(EXIT_SUCCESS);
    return 0;
}

В приведенном выше коде мне нужно блоки кода, которые пытаются перехватить, когда пользователь нажимает клавишу со стрелкой влево или вправо, и переместить курсор в окне к соответствующему выбору (RAW ADDRESS или COMPARISON). Однако по какой-то причине я не могу ничего ответить на клавиши со стрелками. Я что-то упускаю с помощью функции wmove () или keypad ()? Что я здесь не понимаю? Перемещается ли функция перемещения относительно того места, где курсор был последним?

Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2018

Вызовы wmove в операторе switch не имеют большого эффекта, потому что логика, ведущая к wgetch, перемещает курсор назад к той же точке:

    wmove(mainwin, 3, 2);
    wattron(mainwin, A_BLINK);
    refresh();
    wrefresh(mainwin);

    choice = wgetch(mainwin);

Кстати, вызовы refresh() не нужны, при быстром чтении источника ...

...