我正在尝试学习使用C ++编写代码的ncurses。我使用Linux Mint和g ++进行编译。我写了下面的代码。我有两个使用newwin()创建的子窗口,它们始终保持其大小。我想要的是当我缩小窗口然后不扩展任何东西来改变。当我水平收缩然后展开时,窗口边缘按预期绘制,没有任何损坏。但是当我垂直做同样的事情时,它看起来像是一个滚动,并在下面添加了空白行。为什么当变化是垂直的时候会发生这种情况,但是当它是水平的时候一切都很好?
#include <ncurses.h>
#include <signal.h>
WINDOW * mainWin;
WINDOW * sideWin;
void resizeHandler(int);
int main()
{
int mainwinStartX = 0;
int mainwinStartY = 0;
int mainwinWidth;
int mainwinHeight;
int sidewinStartX;
int sidewinStartY = 0;
int sidewinWidth;
int sidewinHeight;
signal(SIGWINCH, resizeHandler);
initscr();
noecho();
refresh();
// Prepairing mainWin sizes
mainwinWidth = float(2)/3 * COLS;
mainwinHeight = LINES;
// Prepairing side win sizes
sidewinStartX = mainwinWidth;
sidewinWidth = COLS - mainwinWidth;
sidewinHeight = LINES;
// creating window objects
mainWin = newwin(mainwinHeight, mainwinWidth, mainwinStartY, mainwinStartX);
sideWin = newwin(sidewinHeight, sidewinWidth, sidewinStartY, sidewinStartX);
box(mainWin, 0, 0);
box(sideWin, 0, 0);
wrefresh(mainWin);
wrefresh(sideWin);
while (getch() != 'x'){}
endwin();
return 0;
}
void resizeHandler(int sigNumber){}
答案 0 :(得分:1)
ncurses有意或无意更新 stdscr
以外的窗口布局。 wresize
的手册页中描述了该行为:
这是curses库的扩展。它重新分配存储空间 一个ncurses窗口,用于将其尺寸调整为指定值。 如果 任何尺寸都大于当前值,即窗口的数据 充满了具有当前背景再现的空白(如 由
wbkgdset
设置合并到其中。
ncurses不会尝试猜测应用程序的首选布局。 resizeterm
手册页指出应用程序应检查从KEY_RESIZE
返回的 wgetch
并更新布局:
KEY_RESIZE
警告应用程序屏幕大小已更改,并且应重新绘制特殊功能(如打击垫) 这不能自动完成。
给定的示例程序有几个问题:
initscr
分配了一个 - 请参阅 initscr Signal Handlers >手册页)box(mainWin, 0, 0); box(sideWin, 0, 0); wrefresh(mainWin); wrefresh(sideWin); while (getch() != 'x'){}
不会重新显示mainWin
和sideWin
中的框,因为:
getch
的循环将重新绘制stdscr
,消灭其他窗口。你可能看到那些窗口的部分覆盖;我只看到整个窗口被(空白)stdscr
覆盖。
答案 1 :(得分:0)
实际上对我有用的代码:
Notice: Undefined index: language in D:\xampp\htdocs\vtiger7\includes\runtime\BaseModel.php on line 31
Notice: Undefined index: action in D:\xampp\htdocs\vtiger7\include\utils\ListViewUtils.php on line 677
Notice: Undefined index: file in D:\xampp\htdocs\vtiger7\include\utils\ListViewUtils.php on line 677
我使用了Thomas建议的KEY_RESIZE,并且必须在终端窗口的每个“resize”键事件上删除并重新创建窗口。