Ncurses Waddch не печатает символ в позиции курсора - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь напечатать символ ch в позиции курсора в окне 1x6.Я хочу, чтобы курсор перемещался вправо, если я ввел 's' / 'k', и влево, если я ввел 'a' / 'j' (и переместился в начало / конец окна, если курсор включенначальная / конечная позиция).Однако waddch не печатает ch в позиции курсора.Я попытался использовать mvwaddch и изменить ch с типа char на тип chtype, и ch по-прежнему не отображается в позиции курсора.Чего мне не хватает, чтобы ch не печатался?

chtype ch = 'X';
char ich;
int cols = 6;
int rows = 1;

WINDOW* win = newwin(rows, cols,  1, 1);
int delwin(WINDOW *win);
raw();


int currPos = 0;


initscr();

noecho();


for(int i = 0; i< 6; i++){


    ich = getch();

    if(ich == 'a' || ich == 'j'){
        //printf("\nsddss\n");

        //mvwaddch(win, 0,currPos - 1,ch);
        wmove(win, rows, currPos - 1);
        waddch(win, ch);
        currPos--;


    }else
    if(ich == 's' || ich == 'k'){
        //printf("sddss3333\n");
       //mvwaddch(win ,0,currPos + 1,ch);
        wmove(win, rows, currPos + 1);
        waddch(win, ch);
        currPos++;
    }
    wrefresh(win);
}

delwin(win);

endwin();

1 Ответ

0 голосов
/ 13 февраля 2019

Вызовы wmove терпят неудачу, потому что вы проходите позицию за окном.Координаты начинаются с нуля, а присвоение ему числа строк ставит его на следующей строке за окном.

Несколько других проблем (getch следует читать из окна win и некоторый другой код был избыточным. Вот краткий пересмотр:

#include <curses.h>

int
main(void)
{
    chtype ch = 'X';
    int cols = 6;
    int rows = 1;
    int i;
    int currPos = 0;
    WINDOW *win;

    initscr();
    raw();
    noecho();

    win = newwin(rows, cols, 1, 1);

    for (i = 0; i < 6; i++) {
        int ich = wgetch(win);

        if (ich == 'a' || ich == 'j') {
            if (currPos > 0) currPos--; else beep();
        } else if (ich == 's' || ich == 'k') {
            if (currPos < cols - 1) currPos++; else beep();
        }
        wmove(win, 0, currPos);
        waddch(win, ch);
    }

    endwin();
    return 0;
}
...