阻止 addCh() 覆盖后续字符 (ncurses, c)

stopping addCh() from overwriting frollowing chars (ncurses, c)

我正在研究一个基本的 ncurses 程序,运行 正在处理这个问题。

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

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

的内容

“elp!”

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

“救命!”

现在这种行为会导致

“hlp”

用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()(在其他words 你正在打印一个字符串的内容,而不是一个字符一个字符地打印。

这需要您在每个 ch 后清屏,并重写所有内容。

这显然很卡,而且不理想,所以我想知道是否有更好的方法。

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

These routines insert the character ch before the character under the cursor. All characters to the right of the cursor are moved one space to the right, with the possibility of the rightmost character on the line being lost. The insertion operation does not change the cursor position.

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

These routines return the character, of type chtype, at the current position in the named window. If any attributes are set for that position, their values are OR'ed into the value returned. Constants defined in <curses.h> can be used with the & (logical AND) operator to extract the character or attributes alone.

(如手册页所述,AND return 值与 A_CHARTEXT 得到角色).