2017-12-02 133 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'将返回一个错误。 –

相关问题