- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在美国劳工部工作。我正在为各州开发屏幕,以帮助他们预测 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/
我是一名优秀的程序员,十分优秀!