2017-12-02 21 views
-1

カーソルが行の先頭にある場合は、b(削除)キーを押しながらカーソルを前の行に移動します。 ncurses内の前の行にカーソルを移動

void processKey() 
{ 
    char ch = getch(); 

    char *check = unctrl(ch); 
    int safe = (check != 0 && strlen(check) == 1); 
    int Trow,Tcol; //Terminal's full rows and columns. 
    getmaxyx(stdscr,Trow,Tcol); 
    int row,col; //Current row and columns. 
    getyx(stdscr,row,col); 

    switch(ch) 
    { 
    case 0x11: //Ctrl + Q 
     closee(); 
     break; 
    case 'b': //pressing "b" deletes the previous character. 
     if(col==0) 
     { 
      //This should move the cursor to the previous line. But that doesn't work. 
      move(row-1,Tcol); 
      addstr("\b \b"); 
      refresh(); 
      break; 
     } 
     else 
     { 
      addstr("\b \b"); 
      break; 
     } 
    default: 
     if(safe) 
     { 
      addch(ch); 
     } 
    } 
} 

私は前の行に移動するには、カーソルを望んでいました。しかし、それは起こらず、カーソルは現在の位置にとどまります。私はmvcur()を使ってこれをやろうとしましたが、同じ結果が表示されます。 これを達成するための適切な方法は何ですか?使用する

+0

FYI:getch()は「char」ではなく「int」を返します。 – TonyB

答えて

-1

関数はmovewmove)である。前者はマクロwmoveを(あるいは、実際に両方の呼び出しとして実装されてもよい

move(row - 1, col); 
wmove(stdscr, row - 1, col); 

getyx(stdscr,row, col); 
move(row - 1, col); 

これらは同じ結果を与えますマクロかもしれません)。

しかし、現在の位置が既に第1行にある場合、それらはエラーERRを返し、ウィンドウをスクロールアップしません。ところで

は、サンプルプログラムは、move/wmove呼び出し、次のaddstrrefreshを行いません。

+0

私は 'move(row-1、Tcol);を変更しました。 wmove(stdscr、row-1、Tcol); refresh(); addstr( "\ b \ b"); ブレーク; 'to 'move(row-1、Tcol); addstr( "\ b \ b"); refresh(); break; 'でも、カーソルは前の行まで移動しません。 –

+0

Tcol変数は、端末の最大カラムを保持するので、 'move(row-1、Tcol);'カーソルを上に移動する必要がありますが、動作しません。私も変数 'COLS'で試みましたが、それでも同じ結果が出ました。 –

+0

座標は0から始まります:COLSを使うとウィンドウの外側に位置し、 'wmove'はエラーを返します。 –

関連する問題