getch () из ncurses не работает - PullRequest
0 голосов
/ 17 декабря 2011

Мне нужно создать mainloop для моей программы и написать следующую функцию:

void menu(){
int ch;
cbreak();
noecho();
initscr();
refresh();
while (ch != KEY_F(9)){
    ch = getch();
    cout << ch << endl;
    switch (ch){
        case KEY_F(1): add();
            break;

        case KEY_F(2): edit();
            break;

        case KEY_F(3):
            break;

        case KEY_F(4):
            break;


    }

}

endwin();

}

Но getch () не работает и печатает -1 в цикле. как я сделаю? Могу ли я установить специальный атрибут или вызвать специальный функционал?

Ответы [ 3 ]

1 голос
/ 17 декабря 2011

Вам нужно позвонить keypad(), например. keypad(stdscr, TRUE). Но помимо этого функциональные клавиши могут не работать на вашем терминале. Проверьте в файле ncurses.h функцию has_key () , и вы можете использовать ее, чтобы определить, доступны ли они на вашем терминале.

0 голосов
/ 29 декабря 2011

Да, мой цикл здесь:

initscr();
clear();
noecho();
cbreak();   /* Line buffering disabled. pass on everything */
startx = (80 - WIDTH) / 2;
starty = (24 - HEIGHT) / 2;


menu_win = newwin(HEIGHT, WIDTH, starty, startx);
keypad(menu_win, TRUE);
mvprintw(0, 0, "Name of my program");
refresh();
print_menu(menu_win, highlight);
while (true)

    {   c = wgetch(menu_win);
        switch(c){
TYPE OF KEYS;
}//END OF SWITCH
}//END OF LOOP
0 голосов
/ 28 декабря 2011

Во-первых, каждая функция ncurses должна использоваться только после вызова initscr().В вашем коде cbreak() и noecho(), вероятно, игнорируются.Во-вторых, если вы хотите использовать функциональные клавиши , вы должны сообщить об этом ncurses, вызвав keypad(stdscr, TRUE).Однако, поскольку не на каждом компьютере есть функциональные клавиши, вы всегда должны проверять, поддерживает ли система эти функции, используя has_key() (то же самое для has_colors(), который проверяет, поддерживает ли текущий терминал цвета).

...