курсор не будет двигаться при использовании move () или wmove () при использовании библиотеки curses - PullRequest
2 голосов
/ 05 октября 2011

У меня есть эта программа, которая печатает первые 5 строк или более текстового файла в окне curses, а затем печатает некоторые персонализированные данные. но после печати строк из текстового файла курсор не будет двигаться при использовании перемещения или перемещения. Я напечатал слово после использования обоих и refresh (), но оно печатается в последней позиции, в которой находился курсор. Я пробовал mvprintw и mvwprintw, но таким образом я ничего не получил. это часть кода

while (! feof(results_file))
    {
        fgets(line,2048,results_file);
        printw("%s",line);
    }
fclose(results_file);
mvwprintw(results_scrn,num_rows_res,(num_col_res/2) - 2,"Close");
wrefresh(results_scrn);

1 Ответ

2 голосов
/ 06 октября 2011

Я подозреваю, что вы пытаетесь печатать за пределами окна.

В частности, я бы предположил, что здесь:

mvwprintw(results_scrn,num_rows_res,(num_col_res/2) - 2,"Close");

... num_rows_res являетсяколичество строк в окне results_scrn - но это означает, что действительные координаты строки находятся в диапазоне от 0 до num_rows_res - 1.

Если вы попытаетесь move() или wmove() за пределами окна,курсор на самом деле не будет двигаться;последующие printw() или wprintw() будут напечатаны в предыдущей позиции курсора.Если вы попытаетесь mvprintw() или mvwprintw(), весь вызов потерпит неудачу в момент попытки переместить курсор, и поэтому он вообще ничего не напечатает.

Вот полная демонстрация (простопечать в stdscr, которая имеет LINES строки и COLS столбцы):

#include <stdio.h>
#include <curses.h>

int main(void)
{
    int ch;

    initscr();
    noecho();
    cbreak();

    /* This succeeds: */
    mvprintw(1, 1, ">>>");

    /* This tries to move outside the window, and fails before printing: */
    mvprintw(LINES, COLS / 2, "doesn't print at all");

    /* This tries to move outside the window, and fails: */
    move(LINES, COLS / 2);

    /* This prints at the cursor (which hasn't successfully moved yet): */
    printw("prints at current cursor");

    /* This is inside the window, and works: */
    mvprintw(LINES - 1, COLS / 2, "prints at bottom of screen");

    refresh();
    ch = getch();
    endwin();
    return 0;
}

(На самом деле функции возвращают результат; если вы проверите его, вы обнаружите, что он ERR в случаях, которые терпят неудачу.)

...