我正在打印文本的位置:(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);
然后我可以在哪里处理该信息中的坐标?
提前感谢您的帮助。
您创建了第二个窗口并使用了第二个窗口,同时仍在 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;
}
您可以使用(旧功能(getcury
并getcurx
由于您没有提供完整的示例,因此很难找出出了什么问题。
这是一个完整的最小工作示例:
#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;
}
输出在"你好,世界!测试字符串并按预期显示X: 23 Y: 12
。