【问题标题】:case KEY_ENTER not functioning as expectedcase KEY_ENTER 未按预期运行
【发布时间】:2015-07-29 16:38:58
【问题描述】:

我正在尝试创建一个响应键盘输入的程序。目前,下面的菜单功能正常,但按回车后我遇到了问题。当我按下回车时,什么也没有发生。我只是想知道为什么会这样? 非常感谢!

#include <ncurses.h>

#define MENUMAX 6

void drawmenu(int item)
{
        int c;
        char mainmenu[] = "Menu";
        char menu[MENUMAX] [10] = {
                "1",
                "2",
                "3",
                "4",
                "5",
                "6"
        };

        clear();
        attron(A_BOLD | A_UNDERLINE);
        addstr(mainmenu);
        attroff(A_BOLD | A_UNDERLINE);
        for( c = 0; c < MENUMAX; c++)
        {
                if( c == item)
                        attron(A_REVERSE);
                attron(A_BOLD);
                mvaddstr(3 + (c * 2), 20, menu[c]);
                attroff(A_BOLD);
                attroff(A_REVERSE);
        }
        refresh();
}

int main(int argc, char *argv[])
{
        int key, menuitem;
        menuitem = 0;
        initscr();
        drawmenu(menuitem);
        keypad(stdscr, TRUE);
        noecho();
        do
        {
                raw();
                nonl();
                key = getch();
                switch(key)
                {
                        case KEY_DOWN:
                                menuitem++;
                                if(menuitem > MENUMAX - 1) menuitem = 0;
                                break;
                        case KEY_UP:
                                menuitem--;
                                if(menuitem < 0) menuitem = MENUMAX - 1;
                                break;
                        case KEY_ENTER:
                                mvaddstr(17, 25, "Test mesage!");
                                refresh();
                                break;
                        default:
                                break;
                }
                drawmenu(menuitem);
        } while(key != '~');

        echo(); 


        endwin();
        return 0;
}

【问题讨论】:

    标签: c++ ncurses


    【解决方案1】:

    如 ncurses 手册页的Initialization 部分所述,该程序未提供一次字符(无缓冲)输入。由于它会寻找特殊的键,例如 KEY_UP,这意味着它应该使用 cbreak(而不是 raw,它防止诅咒解码特殊键)。

    【讨论】:

    • 所以我要把break; 替换成cbreak; 吗?
    • cbreak (请参阅我的答案中的联机帮助页链接)是一个函数。它以一种常见的终端模式命名。 This page 似乎提供了有用的术语介绍。
    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2020-06-28
    • 2012-02-18
    • 2018-01-18
    • 2012-06-14
    • 2019-03-03
    • 2012-09-21
    相关资源
    最近更新 更多