我在美国劳工部工作。我正在为州制定屏幕,以帮助他们预测未来几年失业保险的发现情况。
我在使用退格键在这些屏幕中工作时遇到问题,我有一些复杂的限制。用户将键入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'))
但没有任何效果。我意识到这两个特殊情况使这个问题复杂化,但我希望有人可以帮我把这个比较工作。
答案 0 :(得分:0)
在我看来,您正在尝试创建用户可以编辑的文本输入字段。如果这是正确的,您应该将代码放在函数中编辑字段。
如上所述,当您启用echo()
时,您将获得各种内容的回音,包括退格,正确显示为{{ 1}}。
关闭回声。
阅读每一把钥匙。如果它是可打印字符(\?
),只需将其添加到字段的当前获取值并更新字段的显示,并使用isprint()
完成。
我也不确定你处理场地的方式。你去(y,x)并打印很多空格,然后返回到(y,x-1) - 外面刚填充空格的区域 - 然后开始递减x - 再次到位置外您用空格清除的区域。这看起来不对。
不要过分担心尝试优化字符串输出到显示器。 NCurses为你做到了这一点。 (老式终端,其中一些软件可能与之交互,非常慢,NCurses的设计非常考虑:它有优化处理它。)因此,只需保持字段的当前状态,并填充,裁剪,并在每次更新时在y,x处打印字符串。