创建子窗口

  前面的笔记说过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);
}

运行结果:
创建子窗口(curses笔记三)

注意,光标的默认位置总是在新窗口的左上角。

相关文章: