在curses.h下如何使用移动功能

时间:2018-07-05 10:18:55

标签: c ncurses curses

它不会在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

有人可以解释...吗?

4 个答案:

答案 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。