2011-12-17 5 views
0
私は私のプログラムのメインループを作成する必要があり、次の関数を書いた

getchは動作しません

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 inループ。どうやって? 特別なattrを設定したり、特別な関数を呼び出せますか?

答えて

1

keypad()に電話する必要があります。 keypad(stdscr, TRUE)。しかし、それ以上の機能キーはあなたの端末では動作しないかもしれません。あなたのncurses.hファイルにhas_key()関数があるかどうか確認し、その関数を使ってターミナルで利用可能かどうかを判断することができます。

+0

cbreakモードの呼び出し()およびnoechoが()も()をinitscrのための呼び出しの後でなければなりません。 – Craig

+0

私はそれを解決した後initscr()私はcbreakを呼び出す必要がありますし、キーパッド()その後getch()正常に動作します。 – PersianGulf

0

最初に、すべてのncurses関数は、initscr()が呼び出された後にのみ使用する必要があります。あなたのコードのcbreak()noecho()はおそらく無視されます。
function keysを使用する場合は、keypad(stdscr, TRUE)を呼び出してncursesに伝える必要があります。ただし、すべてのコンピュータがファンクションキーを持っているわけではないので、システムがその機能をサポートしているかどうかを常に確認する必要があります。has_key()(現在の端末がカラーをサポートしているかどうかを確認するhas_colors()と同じです)。

0

はい、私のループはここにある:

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 
関連する問題