2017-12-02 171 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

僅供參考:getch()返回一個「int」,而不是「char」。 – TonyB

回答

-1

的函數的使用是movewmove):

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

這些給出相同的結果:

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

雖然前者可作爲宏調用wmove(或實際上這兩者來實施可能是宏)。

但是,如果你的當前位置已經是第一行,那些返回一個錯誤ERR,並不會導致窗口滾動。

順便說一下,示例程序在調用move/wmove之後的addstr之後不會執行refresh

+0

先生,我已經改變了'移動(第一行,Tcol); wmove(stdscr,row-1,Tcol); refresh(); addstr(「\ b \ b」); break;''移動(row - 1,Tcol); addstr(「\ b \ b」); refresh(); break;'但仍然光標不移動到前一行。 –

+0

Tcol變量保存終端的最大列數,所以通過傳遞'move(row-1,Tcol);'應該向上移動光標,但不起作用。我也嘗試過用變量'COLS'但仍然是相同的結果。 –

+0

座標基於零:使用COLS將位置放在窗口之外,並且'wmove'將返回一個錯誤。 –