сохранить позицию курсора ncurses как переменную - PullRequest
0 голосов
/ 28 августа 2018

Я печатаю текст в месте: (10, 10).

  • Ожидание ввода,
  • очистка экрана,
  • делает это снова.

Когда я печатаю текст, он перемещает курсор в конец строки. Как получить эту позицию X, Y и сохранить ее как переменную?

Я хочу сделать это, чтобы нарисовать анимированную рамку вокруг текста.

Я знаю, что есть getyx(window, y, x), но у него есть void возврат.

Я пытался использовать его, но он не меняет значения x и y, он все равно будет печататься на 0, 0. Я не могу понять, как использовать этот метод, чтобы сделать что-нибудь.

x = y = 0;
getyx(screen, y, x);
move(y, x);
printw("YX TEST"); // prints at 0,0 (bad)

Я хотел бы сделать что-то вроде:

yPos = getY(screen);
xPos = getX(screen);

Где я могу обработать координаты из этой информации?

Заранее спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы создали второе окно и использовали это второе окно, продолжая рисовать stdscr . Я могу воспроизвести Ваш вопрос с:

WINDOW *w1 = initscr();
WINDOW *w2 = newwin(LINES, COLS, 0, 0);
move(10, 10); // this moves the cursor on w1 or stdscr to (10, 10)
printw("YX TEST"); // this draws on w1, ie. stdscr the default screen
// now the cursor on w1 is on (10, 15) and cursor on w2 is on (0,0)
int x, y;
getxy(w2, x, y); // this gets the position of w2 window, which stayed at (0,0)
getxy(w1, x, y); // this will get you the position in w1 window, ie (10, 15)
refresh(); // this will draw window w1 on the screen, ie. `YX TEST`
wrefresh(w2); // this will draw nothing on the screen, as window w2 is empty

Если у вас есть два окна, и вы рисуете одно и получаете позиции курсора от второго, вы получите странные результаты.
Следующее:

#include <ncurses.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>

void mybox(WINDOW *w, int sx, int sy, int ex, int ey)
{
        assert(w != NULL);
        assert(sx <= ex);
        assert(sy <= ey);
        // up
        wmove(w, sy, sx);
        wprintw(w, "+");
        for (int i = sx + 1; i < ex; ++i) {
                wprintw(w, "-");
        }
        wprintw(w, "+");
        // left right
        for (int i = sy + 1; i < ey; ++i) {
                wmove(w, i, ex);
                wprintw(w, "|");
                wmove(w, i, sx);
                wprintw(w, "|");
        }
        // down
        wmove(w, ey, sx);
        wprintw(w, "+");
        for (int i = sx + 1; i < ex; ++i) {
                wprintw(w, "-");
        }
        wprintw(w, "+");
}

int main() {
        WINDOW *w = initscr();
        for (int i = 2; i; --i) {
                // print text at a location (10,10)
                move(10, 10);
                printw("YX TEST %d", i);
                refresh();
                // let's draw a box around.
                int x, y;
                getyx(w, y, x);
                mybox(w, 9, 9, x, y + 1); // x = 10, y = 19
                refresh();
                // wait for input
                getch();
                // clear screen
                clear();
                // doing it again
        }
        endwin();
        return 0;
}

рисует рамку вокруг YX TEST ? текста:

 +---------+
 |YX TEST 2|
 +---------+

Если вы хотите иметь функции, которые возвращают позицию курсора, просто напишите их ...

 int getX(WINDOW *win) {
      int x, y;
      getxy(win, y, x);
      return x;
 }

 int getY(WINDOW *win) { 
      int x, y; 
      getxy(win, y, x); 
      return y;
 }
0 голосов
/ 28 августа 2018

Поскольку вы не предоставили полный пример, трудно понять, что происходит не так.

Вот полный минимальный рабочий пример:

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

int main(void) {

    WINDOW * win = initscr();

    mvaddstr(10, 10, "Hello, world!");
    refresh();

    int y,x;
    getyx(win, y, x);

    // Test output two lines below
    y+=2;
    mvprintw(y, x, "X: %d, Y: %d", x, y);
    refresh();

    // press the ANY key ;-)
    getch();
    endwin();

    return EXIT_SUCCESS;
}

Вывод находится ниже справа от Hello, World! Тестовая строка и показывает X: 23 Y: 12, как и ожидалось.

0 голосов
/ 28 августа 2018

Вы можете использовать ( устаревшие функции ) getcury и getcurx

...