问题描述
我正在开发一个基本的 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
以仅获取字符)。