2017-04-26 19 views
0

私はプログラミングが初めてで、C言語のncursesで次のことを実現したいと考えています。 このフォームに記入するフィールドとそのフォームの下には、フォームを記入する際にユーザが観測するセンサ値を変更し、結果として所望の動作が得られる。ncursesフォーム:編集カーソルの表示/アクティブなフィールドの強調表示

私はこれまでフィールドバッファを変数に入れることができてうれしいですが、returnキーを押すことで、今はgoogleableではないような問題に直面しています。

私のプログラムは、私が下に掲載した例から始まった。元の例では、私はちょうど2行追加し、それはすでに私の問題を非常によく示しています。

タイムアウト(1)を設定しました。 getch()関数は新しいセンサー値を出力する前にフォームのユーザー入力を待機しません。 whileループにmvprintでsennsor値を入れました。

センサーの値は常に最新で、矢印キーでフィールド間を移動してフィールドに入力することもできます。 しかし、可視のカーソルは常にセンサーの値にとどまりますが、それは印刷のために連続的に移動されるため、私には意味があります。フォームドライバは、最後に編集された位置を覚えているように見えるので、フィールドの編集は機能しますが、どの位置にタイピングが行われるかについての光学的なヒントはありません。ドキュメントでは、この位置を「編集カーソル」と呼んでいます。

私は何か完全に間違っていますか?または、フィールドを強調表示する方法、または編集カーソルを表示させる方法がありますか? ありがとうございました!

/* gcc -Wall -pthread -g -o formncurses formncurses.c -lform -lncurses */ 

    #include <form.h> 

    int main() 
    { FIELD *field[3]; 
    FORM *my_form; 
    int ch; 

    /* Initialize curses */ 
    initscr(); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    timeout(1); 

    /* Initialize the fields */ 
    field[0] = new_field(1, 10, 4, 18, 0, 0); 
    field[1] = new_field(1, 10, 6, 18, 0, 0); 
    field[2] = NULL; 

    /* Set field options */ 
    set_field_back(field[0], A_UNDERLINE); /* Print a line for the option */ 
    field_opts_off(field[0], O_AUTOSKIP); /* Don't go to next field when this */ 
         /* Field is filled up  */ 
    set_field_back(field[1], A_UNDERLINE); 
    field_opts_off(field[1], O_AUTOSKIP); 

    /* Create the form and post it */ 
    my_form = new_form(field); 
    post_form(my_form); 
    refresh(); 

    mvprintw(4, 10, "Value 1:"); 
    mvprintw(6, 10, "Value 2:"); 
    refresh(); 

    /* Loop through to get user requests */ 
    while((ch = getch()) != KEY_F(1)) 
    { switch(ch) 
     { case KEY_DOWN: 
       /* Go to next field */ 
       form_driver(my_form, REQ_NEXT_FIELD); 
       /* Go to the end of the present buffer */ 
       /* Leaves nicely at the last character */ 
       form_driver(my_form, REQ_END_LINE); 
       break; 
      case KEY_UP: 
       /* Go to previous field */ 
       form_driver(my_form, REQ_PREV_FIELD); 
       form_driver(my_form, REQ_END_LINE); 
       break; 
      default: 
       /* If this is a normal character, it gets */ 
       /* Printed    */  
       form_driver(my_form, ch); 
       break; 
     } 

    mvprintw(12, 10, "Here stands the changing sensor value"); 

    } 

    /* Un post form and free the memory */ 
    unpost_form(my_form); 
    free_form(my_form); 
    free_field(field[0]); 
    free_field(field[1]); 

    endwin(); 
    return 0; 
} 

答えて

0

getchコールは、基本的にあなたのmvprintw標準画面上に—を残しているカーソルを残すためにはncursesを伝えます。フォームに移動させるには、wgetchを使用し、現在のフォーム(フィールドのウィンドウの位置を保持する)にWINDOW*ポインターを渡すように指示する必要があります。

さらに読書:

+0

グレート! Wgetchのフォームのための追加のウィンドウで、現在動作しています。実際に私はこれを前に試してみたところ、明らかに何か間違いを犯して、キーを押さないと値が更新されないようにしていました。だから私は(間違って)wgetchはタイムアウト(1)の影響を受けないと結論付けました。どうもありがとう! – Wonnegrausen

関連する問題