将字符串添加到 window 时 Ncurses 无换行模式
Ncurses no-wrap mode when adding strings to window
我正在使用 waddwstr()
函数向 window 添加字符串,一行接一行,连续多行。我不希望 ncurses
为我自动换行 – 我通过连续调用 waddwstr()
覆盖它们,有时会显示上一行的尾部。 ncurses
可以在到达 window 的右边缘时停止吗?
非包装函数的名称中包含“ch”,例如 wadd_wchstr。
非宽接口也是如此waddstr versus waddchstr。
然而,wrapping/non-wrapping 函数的不同之处不止于此。它们使用不同的参数类型。环绕函数依赖于通过 wattr_set
等设置的视频属性,而非环绕函数将视频属性与字符数据相结合:
waddstr
and waddchstr
分别使用char*
和chtype*
参数
waddwstr
and wadd_chstr
使用 wchar_t*
和 cchar_t*
参数。
在两种形式之间进行转换可能会很麻烦,因为 X/Open 等没有定义进行转换的函数。
bkgd
的手册页描述了如何将这些视频属性与 背景字符 结合以获得实际显示。
已接受的答案(来自 Dickey 先生)是正确的。但是,“ch”函数不适用于普通的 C 字符串(字节数组)。另一个解决方案是为 waddstr
创建一个包装器,它检查当前光标位置和 window 大小并只打印适合的内容。
例如:
int waddstr_trunc(WINDOW *win, const char *str)
{
int cur_x, max_x, dummy [[maybe_unused]];
getyx(win, dummy, cur_x);
getmaxyx(win, dummy, max_x);
int w=max_x - cur_x;
if (w <= 0) return 0;
char *str2 = strndup(str, w);
if (str2 == NULL) return 1;
int rv = waddstr(win, str2);
free(str2);
return rv;
}
我正在使用 waddwstr()
函数向 window 添加字符串,一行接一行,连续多行。我不希望 ncurses
为我自动换行 – 我通过连续调用 waddwstr()
覆盖它们,有时会显示上一行的尾部。 ncurses
可以在到达 window 的右边缘时停止吗?
非包装函数的名称中包含“ch”,例如 wadd_wchstr。
非宽接口也是如此waddstr versus waddchstr。
然而,wrapping/non-wrapping 函数的不同之处不止于此。它们使用不同的参数类型。环绕函数依赖于通过 wattr_set
等设置的视频属性,而非环绕函数将视频属性与字符数据相结合:
waddstr
andwaddchstr
分别使用char*
和chtype*
参数waddwstr
andwadd_chstr
使用wchar_t*
和cchar_t*
参数。
在两种形式之间进行转换可能会很麻烦,因为 X/Open 等没有定义进行转换的函数。
bkgd
的手册页描述了如何将这些视频属性与 背景字符 结合以获得实际显示。
已接受的答案(来自 Dickey 先生)是正确的。但是,“ch”函数不适用于普通的 C 字符串(字节数组)。另一个解决方案是为 waddstr
创建一个包装器,它检查当前光标位置和 window 大小并只打印适合的内容。
例如:
int waddstr_trunc(WINDOW *win, const char *str)
{
int cur_x, max_x, dummy [[maybe_unused]];
getyx(win, dummy, cur_x);
getmaxyx(win, dummy, max_x);
int w=max_x - cur_x;
if (w <= 0) return 0;
char *str2 = strndup(str, w);
if (str2 == NULL) return 1;
int rv = waddstr(win, str2);
free(str2);
return rv;
}