创建子窗口
前面的笔记说过curses窗口用WINDOW类型来表示,其中有一个特例称之为stdscr(标准窗口)。有时一个标准窗口并不能满足一些程序应用,需要在标准窗口中创建一些子窗口,就像图形界面下一个桌面并不够用,要启动程序就要在桌面上再启动一些子窗口。
子窗口的创建和删除用到如下函数:
#include <curses.h>
WINDOW *newwin(int num_of_lines, int num_of_cols, int start_y, int start_x);
int delwin(WINDOW *window_to_delete);
对于newwin函数而言,num_of_lines和num_of_cols分别表示新窗口的行数和列数,start_y和start_x表示新窗口左上角的坐标(start_y, start_x) 。默认情况下新窗口会在已有窗口之上(即覆盖原有窗口,原来内容并不会删除)。
delwin函数用于删除窗口。
需要注意的是,不要去删除stdscr和curscr窗口。
另外,有了子窗口就会有很多额外的问题,例如printw、addch等函数都是原先在stdscr进行输出的函数,要如何相对于子窗口在子窗口上进行输出;newwin创建的是stdscr的子窗口,要如何创建子窗口的子窗口。这些问题后面再写笔记记录,这次先记录一个函数wrefresh:
#include <curses.h>
int wrefresh(WINDOW *window_ptr);
refresh函数只能用于刷新标准窗口stdscr,而wrefresh函数可以刷新指定的窗口。
代码示例:
#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
int main(int argc, char **argv)
{
WINDOW *screen = initscr();
WINDOW *chilwin1 = newwin(15, 75, 1, 1);
WINDOW *chilwin2 = newwin(5, 75, 17, 1);
box(screen, '*', '*');
box(chilwin1, ACS_VLINE, ACS_HLINE);
box(chilwin2, ACS_VLINE, ACS_HLINE);
refresh();
wrefresh(chilwin1);
wrefresh(chilwin2);
sleep(12);
delwin(chilwin1);
delwin(chilwin2);
endwin();
exit(EXIT_SUCCESS);
}
运行结果:
注意,光标的默认位置总是在新窗口的左上角。