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

Posted

技术标签:

【中文标题】无法使用箭头键在诅咒中移动光标 (C)【英文标题】:Cannot get arrow keys to move cursor in curses (C) 【发布时间】:2018-04-28 23:38:33 【问题描述】:

下面是我的代码。我有一个主窗口,有两个选择,我希望用户能够来回键入以仅使用 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】:

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

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

    choice = wgetch(mainwin);

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

【讨论】:

以上是关于无法使用箭头键在诅咒中移动光标 (C)的主要内容,如果未能解决你的问题,请参考以下文章

防止“向上箭头”键在文本框中重置光标位置

如何检测在 C 中使用诅咒按下的箭头键?

防止焦点 div 使用箭头键滚动

excel中如何只用键盘修改单元格内容

使用 PhpStorm IdeaVim,我无法使用 shift+箭头键选择单词

无法从 C/C++ 代码中单击我的鼠标