c - 让退格键在 curses 屏幕中工作

标签 c curses backspace

我在美国劳工部工作。我正在为各州开发屏幕,以帮助他们预测 future 几年失业保险的表现。

我在让退格键在这些屏幕上工作时遇到问题,而且我有一些复杂的限制。用户将键入 字段中的数字值,我必须向用户显示键入的内容。这需要我有 echo(),我不能使用 noecho()。

另一个问题是用户遍布全国所有州,并且会有不同的终端,因此他们的 terminfo 中会有不同的值。

11 月 2 日,我能够让以下代码工作,然后在第二天早上我被要求更新 Google Chrome 时它停止工作。该更新显然改变了我的术语信息。

请注意,此代码是模块中 300 多行代码的一部分,我只包含了使退格键起作用的重要代码:

WINDOW *win;

  main()
  {
    int key,i,x,y,newStrlen,accumFlag;
    char newString[8];

    initscr();
    cbreak();
    nonl();
    win=newwin(0,0,0,0);
    keypad(win, TRUE);

    echo();
    key=wgetch(win);

    if (key == 127) /* check for the backspace key */
    {
        if (i > 0)
        {
           mvwprintw(win,y,x,"        ");
           wmove(win,y,x-1);
           newStrlen = strlen(newString);
           newString[newStrlen-1] = '\0';
           i -= 1;
           accumFlag -= 1;
           x = x - 1;
           wrefresh(win);
        }
    }
  }

我现在得到“^?”当我按下退格键时。我尝试过不同的 if 测试,例如

   if (key == KEY_BACKSPACE)
   if ((key == 127) || (key == 8) || (key == '\b'))
   if ((key == '^?') || (key == '^H') || (key == '\b'))

但没有任何效果。我意识到这两个特殊条件使这个问题复杂化,但我希望有人能帮助我进行比较。

最佳答案

在我看来,您正在尝试创建一个用户可以编辑的文本输入字段。如果这是正确的,您应该将用于编辑字段的代码放在一个函数中。

如前所述,当您打开 echo() 时,您将收到各种内容的回显,包括退格键,正确 显示为 \?

关闭回显。

阅读每个键。如果它是可打印字符 (isprint()),只需将其添加到字段的当前获取值并更新字段的显示,使用 wrefresh() 完成。

我也不确定您处理该字段本身的方式。您转到 (y,x) 并打印大量空格,然后返回到 (y,x-1) — 在刚刚填充空格的区域之外 — 然后开始递减 x — 再次返回位置在您用空格清除的区域之外。这看起来不对。

不要太担心尝试优化显示的字符串输出。 NCurses 在下面为您做这些。 (旧时的终端,其中一些您的软件可能与之交互,速度非常慢,而 NCurses 的设计非常考虑到这一点:它具有处理它的优化。)所以只需保持字段的当前状态,然后填充、裁剪, 并在每次更新时在 y,x 处打印字符串。

关于c - 让退格键在 curses 屏幕中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47139480/

相关文章:

c - 函数不修改字符数组

c - 需要帮助尝试根据用户输入计算平均值。 C

python - 编写数论程序

c - 如何在 Linux 中安装 curses.h 头文件(或包含它的包)?

Perl Curses::UI - 循环

c - 我代码中的\b 不会使光标返回

c - 如何分别计算所有行的平均值

c++ - 如何避免 ncurses 中的 stdscr 重叠?

bash - Bash 中的退格

c - 了解 C 中的退格 (\b) 行为