它不会在y = 10,x = 20的坐标处打印。
#include <stdio.h>
#include <curses.h>
int main()
{
initscr();
refresh();
WINDOW *win;
wmove(win, 10, 20);
refresh();
printf("hi\n");
return 0;
}
当我这样执行时...
./a.out > op_file
这是op_file
[?1049h[1;24r(B[m[4l[?7h[H[2J-1
hi
有人可以解释...吗?
答案 0 :(得分:3)
您必须使用initscr()
函数来初始化屏幕,并使用endwin()
最后关闭窗口...
如果您move()
,则必须使用refresh()
,否则光标将不会实际移动。
答案 1 :(得分:1)
要将光标移动到窗口上的新位置,请使用int wmove(WINDOW * win,int y,int x)函数
wmove(win,y,x); 其中(x,y)是窗口中新位置的坐标。如果窗口具有nlines行和ncolumns列,则
0 <= y < nlines
0 <= x < ncolumns
刷新。直到您进行一次wrefresh(win)操作后,屏幕上才会显示实际的光标移动。
move(y,x)等同于wmove(stdscr,y,x)。
move()和wmove()函数将与当前或指定窗口关联的光标相对于窗口原点移动到(y,x)。该功能在下一次刷新操作之前不会移动终端的光标。
要将逻辑光标从用户定义的窗口my_window中移至坐标y = 5,x = 10,请使用:
#include <stdio.h>
#include <curses.h>
int main(){
refresh();//First refresh
WINDOW *my_window;
int a = wmove(my_window, 5, 10);
refresh();////Second refresh
printf("%d\n",a);
printf("hi\n");
return 0;
}
答案 2 :(得分:0)
输出
[?1049h[1;24r(B[m[4l[?7h[H[2J-1
hi
显示写入的可打印字符。如果您查看完整的文本,例如在文本编辑器中,则在 [
和 {{ 1}} 字符,因为这是转义序列的一部分。
您的示例没有显示光标移动(除了 home 位置,您会在附近看到 (
最后),因为curses库没有理由真正移动光标。如果您要求它例如使用 ^[[H
来读取字符,则必须停止并确定光标应在何处—而您的 getch
< / strong>可以执行此操作-除了未初始化 wmove
之外。最简单的方法是使用 win
(由stdscr
初始化)。
程序不执行 initscr
(使终端处于原始模式)而退出curses呼叫。确实会通过 endwin
调用将数据写入屏幕。用 refresh
写入的数据碰巧以正确的顺序输出,但这只是偶然的,因为它没有使用与ncurses相同的输出缓冲。
其他两个答案都包含类似的错误。
答案 3 :(得分:-2)
这有效。
#include <stdio.h>
#include <curses.h>
int main()
{
initscr();
refresh();
WINDOW *win;
win = stdscr;
wmove(win, 10, 10);
refresh();
printf("hi\n");
return 0;
}
感谢@interjay。