2017-11-06 12 views
1

私は米国労働省に勤務しています。私は、失業保険が今後数年間にどのように機能するのかを予測するのに役立つ州のためのスクリーンを開発しています。バックスペースをcurses画面で使用するには

これらの画面でバックスペースキーを使用する際に問題が発生しましたが、いくつかの制限があります。ユーザーは の数値をフィールドに入力するので、入力した内容をユーザーに表示する必要があります。これにはecho()を使用する必要があり、noecho()は使用できません。

もう1つの問題は、ユーザーが国のすべての州にまたがっていて、異なる端末を持つことで、端末のterminfoが異なることです。

11月2日、私は次のコードを取得できました。翌朝Google Chromeを更新するために午前中に要求されたときに、翌日の作業が停止しました。その更新によって明らかに私のterminfoが変更されました。私は今取得

WINDOW *win; 

    main() 
    { 
    int key,i,x,y,newStrlen,accumFlag; 
    char newString[8]; 

    initscr(); 
    cbreak(); 
    nonl(); 
    win=newwin(0,0,0,0); 
    keypad(win, TRUE); 

    echo(); 
    key=wgetch(win); 

    if (key == 127) /* check for the backspace key */ 
    { 
     if (i > 0) 
     { 
      mvwprintw(win,y,x,"  "); 
      wmove(win,y,x-1); 
      newStrlen = strlen(newString); 
      newString[newStrlen-1] = '\0'; 
      i -= 1; 
      accumFlag -= 1; 
      x = x - 1; 
      wrefresh(win); 
     } 
    } 
    } 

「^?」:このコードは、モジュール内のコードの300+ラインの一部であることを

注、私は仕事にバックスペースキーを得るために重要なコードが含まれて私がバックスペースキーを押したとき。

if (key == KEY_BACKSPACE) 
    if ((key == 127) || (key == 8) || (key == '\b')) 
    if ((key == '^?') || (key == '^H') || (key == '\b')) 

など、さまざまなif testsを試してみましたが、何も問題はありません。私はこの2つの特別な条件がこの問題を複雑にしていることを認識していますが、

+3

もちろん、 'noecho()'を使うことができます。文字を手動で出力するだけです。これは実際には、画面上のきめの細かい制御が必要な多くの場合(つまり、フィールドサイズの制限、_backspace handling_など)、どのように行われているのですか? – Ctx

答えて

0

ユーザーが編集できるテキスト入力フィールドを作成しようとしているようです。これが正しければ、関数内のフィールドを編集するコードを記述する必要があります。

としては、すでにあなたが上echo()を持っているとき、あなたは、もののすべての種類の正しくショー\?としてバックスペース、などのをエコー取得します、指摘しました。

エコーをオフにします。

すべてのキーを読み取ります。印刷可能な文字(isprint())の場合は、フィールドの現在取得している値に追加し、フィールドの表示を更新します(wrefresh())。

また、フィールド自体の処理方法もわかりません。 の外側にあるの外側には、ちょうど空白で埋められた領域があります。次に、の外側のの領域に再びxをデクリメントし始めます(y、x)あなたはスペースでクリアしました。これは正しく見えません。

文字列出力をディスプレイに最適化しようと心配しないでください。 NCursesはあなたのためにそれを行います。 (旧式の端末、あなたのソフトウェアがやりとりしている可能性のあるものは非常に遅く、NCursesはそのことを非常に念頭に置いて設計されています:それに対処するための最適化があります。)フィールドの現在の状態を保持し、 、更新のたびにy、xに文字列を出力します。

関連する問題