2017-12-02 6 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()는 "char"이 아닌 "int"를 반환합니다. – TonyB

답변

-1

함수 move (wmove)이다 전자는 매크로 wmove을 (또는 사실상 모두 호출로서 구현 될 수 있지만

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

:

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

다음은 동일한 결과를 수득 매크로 일 수 있음).

그러나 현재 위치가 이미 첫 번째 행에있는 경우 해당 위치는 오류 ERR을 반환하며 창을 위로 스크롤하지 않습니다.

는 그런데, 샘플 프로그램은 move/wmove 호출 다음 addstrrefresh하지 않습니다.

+0

각하'move (row-1, Tcol);을 변경했습니다. wmove (stdscr, row-1, Tcol); refresh(); addstr ("\ b \ b"); 중단;'이동 '(행 -1, Tcol); addstr ("\ b \ b"); refresh(); break;'여전히 커서는 이전 행까지 이동하지 않습니다. –

+0

Tcol 변수는 터미널의 최대 열을 보유하므로 'move (row-1, Tcol);' 커서 위로 이동해야하지만 작동하지 않습니다. 나는 또한 변수 'COLS'로 시도했지만 여전히 같은 결과를 보인다. –

+0

좌표는 0부터 시작합니다 : COLS를 사용하면 창 밖으로 위치가 지정되며,'wmove'는 오류를 반환합니다. –

관련 문제