繁体   English   中英

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

[英]Cursor leaves window when typing (ncurses)

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

当我写完时,光标位于我写的字符串的末尾在此处输入图片说明

但是当我开始打字时,光标移动到终端窗口的左上角。

在此处输入图片说明

如何在打字时将其保持在原位?

这是我的代码:

#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;
}

scanw (和wscanw )最终调用wgetch ,它刷新作为其参数给出的窗口:

如果窗口不是垫,并且自上次调用wrefresh以来它已被移动或修改,则wrefresh将在读取另一个字符之前调用。

也就是说, stdscr任何未决更改(包括由于initscr导致的擦除)都将由普通scanw 光标将留在程序要求输入的窗口中的当前位置。

这是因为您使用的是scanw(...)函数,它最终的作用类似于wscanw(stdscr, ...)stdscr获取输入。 使用wscanw函数来解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM