c - ncurses 子窗口不保持固定宽度
问题描述
我有一个 ncurses 程序,有多个子窗口充当列。每个子窗口都有固定的宽度和父终端窗口的高度。
但是我发现,如果终端的宽度减小,那么其中一个窗口会失去其固定宽度,并且似乎会使用终端的整个剩余宽度“溢出”它们先前设置的边界。
这是我用于上述的代码:
#include <ncurses.h>
int main() {
WINDOW * winA, * winB;
int i = 0, width = 30;
initscr();
// Suppress stdout
noecho();
// Enable keypad
keypad(stdscr, true);
// interrupt, quit, suspend, and flow control characters are all passed through uninterpreted
raw();
winA = newwin(0, width, 0, 0);
winB = newwin(0, width, 0, width);
timeout(50);
while(getch() != 'q') {
i = width * getmaxy(stdscr);
werase(winA);
werase(winB);
while (i--) {
waddstr(winA, "0");
waddstr(winB, "1");
}
wnoutrefresh(stdscr);
wnoutrefresh(winA);
wnoutrefresh(winB);
doupdate();
}
endwin();
return 0;
}
这是另一个屏幕截图,显示了我的实际程序中的问题。左边的终端是正确的,右边的终端显示了调整窗口大小并触发此问题后的结果:
当终端调整为小宽度时,如何防止窗口失去其固定宽度?
解决方案
您可以使用pads ,而不是使用windows来处理所有事情。Windows 受限于屏幕大小,而 pad 则不受限制。
当 ncurses 获得 aSIGWINCH
时,它会调整大小stdscr
以及包含在其中的所有内容stdscr
,根据需要缩小这些窗口以适应新的屏幕尺寸,或者(如果它们的边距与旧的屏幕尺寸匹配),增加它们的尺寸。那是自动的。您的程序可以检查KEY_RESIZE
返回的getch
并调用wresize
以更改窗口大小(并重绘其内容)。
如果您使用了pads,则不会调整它们的大小(通过调用者可以调整的视口显示 pads)。
推荐阅读
- cmake - 有什么方法可以简化 CMake 中多个库的链接?
- sql-server - 是否可以在 USE GO 子句中定义完整的 SELECT 子句?
- java - Gson:如何将 JsonObject/JsonElement 作为可序列化传递?
- angular - ibm-carbone-styles 的使用
- c# - 为什么在有很多文件要搜索的情况下在内部文件中搜索文本时,内存使用量会超过 2GB?
- amazon-quicksight - 如何使用月份名称设置控件
- python - 参数化后如何运行拆卸功能/夹具
- json - 如何访问下面模式中提到的 react native 中的 json 数据?
- laravel - 显示属于课程的课程的测试
- angular - 检查是否使用了 setter