代码之家  ›  专栏  ›  技术社区  ›  Nidrax

键入时光标离开窗口(ncurses)

  •  2
  • Nidrax  · 技术社区  · 9 年前

    我正在使用ncurses为我的应用程序制作一个简单的TUI。 我已经掌握了创建和打印窗口的基本知识,但我在输入方面有问题。

    当我写完后,光标位于我写的字符串的末尾 enter image description here

    但当我开始键入时,光标会移动到终端窗口的左上角。

    enter image description here

    我在打字时怎样才能把它放好?

    这是我的代码:

    #include <ncurses.h>
    
    WINDOW *win;
    int startx, starty, width, height;
    int cport;
    
    
    WINDOW *makewin(int h, int w, int y, int x)
    {
        WINDOW *lwin;
    
        lwin = newwin(h, w, y, x);
        box(lwin, 0 , 0);
        wrefresh(lwin);
    
        return lwin;
    }
    
    void dewin(WINDOW *lwin)
    {
        wborder(lwin, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
        wrefresh(lwin);
        delwin(lwin);
    }
    
    void getPort(){
        win = makewin(height, width, starty, startx);
        wbkgd(win, COLOR_PAIR(1));
        mvwprintw(win, 0, 8, "Port Settings");
        mvwprintw(win, 2, 4, "Set port server should");
        mvwprintw(win, 3, 4, "listen to: ");
        wrefresh(win);
    
        scanw("%d", &cport);
    }
    
    int main()
    {
        initscr();
        cbreak();
        keypad(stdscr, TRUE);
    
    
            start_color();
    
            init_pair(1,COLOR_WHITE, COLOR_BLACK);
            init_pair(2,COLOR_WHITE, COLOR_BLUE);
            bkgd(COLOR_PAIR(2));
            refresh();
    
            height = 6;
            width = 30;
            starty = (LINES - height) / 2;
            startx = (COLS - width) / 2;
    
            getPort();
    
    
        getch();
    
        dewin(win);
        endwin();
        return 0;
    }
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   Thomas Dickey    9 年前

    scanw (和 wscanw )最终呼叫 wgetch ,刷新作为其参数的窗口:

    如果窗口不是键盘,并且自上次调用 wrefresh , 令人讨厌的 将 在读取另一个字符之前调用。

    即,任何挂起的更改(包括由于 initscr )用于 stdscr 将由平原应用 扫描 。光标将留在程序要求输入的窗口中的当前位置。

        2
  •  0
  •   Aarian P. Aleahmad    9 年前

    因为你在使用 scanw(...) 最终起作用的功能 wscanw(stdscr, ...) 从中获取输入 stdscr 使用 wscanw 函数来解决问题。