在curses 中无法使用箭头键移动光标(C)

标签 c ncurses curses keypad

下面是我的代码。我有一个主窗口,有两个选择,我希望用户能够仅使用 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;
}

在上面的代码中,我必须 try catch 用户按下向左或向右箭头键时的代码块,并将窗口中的光标移动到适当的选择(原始地址或比较)。然而,由于某种原因,我无法得到任何东西来响应箭头键。 wmove() 函数或 keypad() 函数是否缺少某些内容?我在这里不明白什么?移动函数是否相对于光标上次所在的位置移动?

谢谢!

最佳答案

switch 语句中的 wmove 调用没有太大效果,因为导致 wgetch 的逻辑将光标移回到同一点:

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

    choice = wgetch(mainwin);

顺便说一句,快速阅读源代码后,似乎不需要 refresh() 调用...

关于在curses 中无法使用箭头键移动光标(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50082013/

相关文章:

c++ - 向某些屏幕位置写入宽字符时,ncurses 会崩溃

c++ - 如何为我的 curses 应用程序关闭或忽略按键重复?

Python 在 Mac OS X 上诅咒鼠标事件

c - 为什么 "fputc "在这里不起作用?它正在抛出垃圾字母

c++ - 杆切割 - 递归

c - Makefile if语句不包含源文件

c++ - Ncurses表单中的字段验证存在问题

windows - 如何让 win32 控制台识别 ANSI/VT100 转义序列?

Python 多线程时的诅咒

c - 如何从 C 程序中执行带参数的可执行文件?