让退格在curses屏幕中工作

时间:2017-11-06 14:44:58

标签: c curses backspace

我在美国劳工部工作。我正在为州制定屏幕,以帮助他们预测未来几年失业保险的发现情况。

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

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

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'))

但没有任何效果。我意识到这两个特殊情况使这个问题复杂化,但我希望有人可以帮我把这个比较工作。

1 个答案:

答案 0 :(得分:0)

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

如上所述,当您启用echo()时,您将获得各种内容的回音,包括退格,正确显示为{{ 1}}。

关闭回声。

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

我也不确定你处理场地的方式。你去(y,x)并打印很多空格,然后返回到(y,x-1) - 外面刚填充空格的区域 - 然后开始递减x - 再次到位置您用空格清除的区域。这看起来不对。

不要过分担心尝试优化字符串输出到显示器。 NCurses为你做到了这一点。 (老式终端,其中一些软件可能与之交互,非常慢,NCurses的设计非常考虑:它有优化处理它。)因此,只需保持字段的当前状态,并填充,裁剪,并在每次更新时在y,x处打印字符串。