2015-07-29 2 views
-1

J'essaie de créer un programme qui répond à l'entrée du clavier. Pour le moment, le menu ci-dessous fonctionne correctement, mais en appuyant sur Entrée, je rencontre des problèmes. Quand j'appuie sur enter rien ne se passe. Je me demande juste pourquoi cela se passe? Merci beaucoup!cas KEY_ENTER ne fonctionne pas comme prévu

#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; 
} 

Répondre

0

le programme n'a pas prévu de caractères à-un-temps (non tamponné) d'entrée, comme décrit dans la section Initialization de la page du manuel ncurses. Comme il recherche des clés spéciales telles que KEY_UP, cela signifie qu'il doit utiliser cbreak (plutôt que raw, ce qui empêche ncurses de décoder des clés spéciales).

+0

Alors, est-ce que je remplace 'break;' par 'cbreak;'? – NSPredator

+0

'cbreak' (voir les liens de la page de manuel dans ma réponse) est une fonction. Il est nommé pour l'un des modes terminaux communs. [Cette page] (https://utcc.utoronto.ca/~cks/space/blog/unix/CBreakAndRaw) semble constituer une introduction utile à la terminologie. –