Ncurses-窗口
前面介绍过标准屏幕 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);
示例:
1 #include <ncurses.h> 2 3 WINDOW* create_newwin(int height, int width, int starty, int startx) 4 { 5 WINDOW* local_win = NULL; 6 local_win = newwin(height, width, starty, startx); 7 box(local_win, 0, 0); 8 wrefresh(local_win); 9 return local_win; 10 } 11 12 void move_win(WINDOW* local_win, int y, int x) 13 { 14 wborder(local_win, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '); // clear border for old win 15 wrefresh(local_win); 16 17 mvwin(local_win, y, x); 18 box(local_win, 0, 0); // reset border 19 wrefresh(local_win); 20 } 21 22 int main() 23 { 24 WINDOW* my_win = NULL; 25 int startx = 0, starty = 0, width = 10, height = 3; 26 int ch = 0; 27 initscr(); 28 cbreak(); 29 keypad(stdscr, TRUE); 30 starty = (LINES - height) / 2; 31 startx = (COLS - width) / 2; 32 printw("Press F1 to exit"); 33 refresh(); 34 my_win = create_newwin(height, width, starty, startx); 35 36 while ((ch = getch()) != KEY_F(1)) { 37 switch(ch) { 38 case KEY_LEFT: 39 move_win(my_win, starty, --startx); 40 break; 41 case KEY_RIGHT: 42 move_win(my_win, starty, ++startx); 43 break; 44 case KEY_UP: 45 move_win(my_win, --starty, startx); 46 break; 47 case KEY_DOWN: 48 move_win(my_win, ++starty, startx); 49 break; 50 } 51 } 52 53 if (my_win) { 54 delwin(my_win); 55 } 56 endwin(); 57 return 0; 58 }