阻止 addCh() 覆盖以下字符 (ncurses, c)

问题描述

我正在开发一个基本的 ncurses 程序并遇到了这个问题。

我试图在不覆盖以下字符的情况下调用 addch()。

基本上,我希望能够输入类似的内容

“elp!”

用左光标移动到第一个位置,然后在当前文本前输入h即可

“帮助!”

在这种行为会导致

“帮助”

用 h 覆盖第一个字符。

我的代码显示了这个问题:

setlocale(LC_ALL,"");
initscr();
cbreak();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
clear();

short currentCh;
int x,y;

while (currentCh = getch()) {
  bool modeChange = false;
  getyx(stdscr,y,x);

  if (currentCh == KEY_LEFT) {
    if (x != 0)
      move(y,x - 1);
  } else {
    addch(currentCh);
  }
}

到目前为止,我最好的想法似乎是保存在字符串中键入的所有字符,然后使用正确的新字符修改该字符串,然后每次键入字符时清除屏幕并调用 addstr()(换句话说,您正在打印字符串的内容,而不是逐个字符)。

这需要您在每次 ch 后清除屏幕,并重写所有内容

这显然很笨拙,也不理想,所以我想知道是否有更好的方法

解决方法

对于这种特殊情况,您可以插入一个字符,而不是使用 addch 使用 insch

这些例程在下面的字符之前插入字符 ch 光标。光标右侧的所有字符都移动一个空格 到右边,可能是最右边的字符 线路丢失。插入操作不会改变光标 位置。

例如,您可以决定在当前单元格包含空白以外的内容时使用它。您可以使用 inch(拼写相似,含义不同)读取该字符:

这些例程返回 chtype 类型的字符,在当前 在命名窗口中的位置。如果为此设置了任何属性 位置,它们的值被或运算到返回的值中。常数 中定义的可以与 &(逻辑与)运算符一起使用 单独提取字符或属性。

(如手册页所述,AND 返回值与 A_CHARTEXT 以仅获取字符)。