前面介绍过标准屏幕 stdscr, stdscr 只是 WINDOW 结构的一个特例。
我们可以使用函数 newwin 和 delwin 来创建和销毁窗口
WINDOW *newwin(int num_of_lines, int num_of_cols, int start_y, int start_x);
int delwin(WINDOW *window_to_delete);
newwin 函数的作用是创建一个新窗口,该窗口从屏幕位置(start_y,start_x)开始,行数和列数分别由参数 num_of_lines 和 num_of_cols 指定。返回一个指向新窗口的指针,如果新窗口创建失败则返回 null。所有的窗口范围必须在当前屏幕范围之内,如果新窗口的任何部分落在当前屏幕范围之外,则 newwin 函数调用失败。通过 newwin 函数创建的新窗口完全独立于所有已存在的窗口。默认情况下,它被放置在任何已有窗口之上,覆盖(但不是改变)它们的内容。
delwin 函数的作用是删除之前通过 newwin 函数创建的窗口。因为调用 newwin 函数可能会给新窗口分配内存,所以当不再需要这些窗口时,不要忘记通过 delwin 函数将其删除。
注:不要尝试删除 curses 自己的窗口 stdscr 和curscr!!!
通用函数
前缀 w 用于窗口,mv 用于光标移动,mvw 用于在窗口中移动光标
int addch(const chtype char);
int waddch(WINDOW *window_pointer, const chtype char);
int mvaddch(int y, int x, const chtype char);
int mvwaddch(WINDOW *window_pointer, int y, int x, const chtype char); int printw(char *format, ...);
int wprintw(WINDOW *window_pointer, char *format, ...);
int mvprintw(int y, int x, char *format, ...);
int mvwprintw(WINDOW *window_pointer, int y, int x, char *format, ...); int mvwin(WINDOW *window_to_move, int new_y, int new_x);
int wrefresh(WINDOW *window_pointer);
int wclear(WINDOW *window_pointer);
int werase(WINDOW *window_pointer);
int touchwin(WINDOW *window_pointer);
int scrollok(WINDOW *window_pointer, bool scroll_flag);
int scroll(WINDOW *window_pointer);
示例:
#include <ncurses.h> WINDOW* create_newwin(int height, int width, int starty, int startx)
{
WINDOW* local_win = NULL;
local_win = newwin(height, width, starty, startx);
box(local_win, , );
wrefresh(local_win);
return local_win;
} void move_win(WINDOW* local_win, int y, int x)
{
wborder(local_win, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '); // clear border for old win
wrefresh(local_win); mvwin(local_win, y, x);
box(local_win, , ); // reset border
wrefresh(local_win);
} int main()
{
WINDOW* my_win = NULL;
int startx = , starty = , width = , height = ;
int ch = ;
initscr();
cbreak();
keypad(stdscr, TRUE);
starty = (LINES - height) / ;
startx = (COLS - width) / ;
printw("Press F1 to exit");
refresh();
my_win = create_newwin(height, width, starty, startx); while ((ch = getch()) != KEY_F()) {
switch(ch) {
case KEY_LEFT:
move_win(my_win, starty, --startx);
break;
case KEY_RIGHT:
move_win(my_win, starty, ++startx);
break;
case KEY_UP:
move_win(my_win, --starty, startx);
break;
case KEY_DOWN:
move_win(my_win, ++starty, startx);
break;
}
} if (my_win) {
delwin(my_win);
}
endwin();
return ;
}