1 curses开发包初接触

~~~~~~~~~~~~~~~~~~~~~


1.1 curses包内容

=================

  * curses.h

    主要控制屏幕的输入和输出,光标的操作,窗口的创建和操作等

  * panel.h

    类似窗口堆栈,不同窗口可以存放其中,并且可以在其中进行移动

  * menu.h

    主要包括创建菜单并且与之交互的函数,主要用来接受用户的选择

  * form

    包括创建表单以及与之交互的函数,主要用来接受用户数据输入


1.2 开始使用curses包

=====================


1.2.1 curses初始化

-------------------

   * 一般情况下在其余的cuses函数被调用前就必须先调用initscr().

   * stdscr和curscr的不同在于

     * stdscr代表的是逻辑屏幕

     * curscr代表的是物理屏幕

     * wfresh函数会根据stdscr和curscr之间的差异更新物理屏幕

   * 如果程序使用多个终端

     * 使用newterm()代替initscr()

     * 对于每个希望与之交互的终端都调用一次newterm()

     * newterm()返回一个SCREEN结构用来引用某个终端

     * 在需要从某个终端接受输入和输出的时候,必须通过set_term(SCREEN)来将它设置成当前终端


1.2.2 终端模式设置

-------------------

   * 终端模式实际上是一系列开关的属性,它们直接影响着终端如何处理输入以及输出.

   * keypad(stdscr,TRUE)

     用来控制是否将键盘上的特殊字符转换成curses包中的对应特殊键

   * nonl()

     用来控制程序将回车键不要转换成换行符

   * cbreak()

     读取除了DELETE或CTRL等特殊字符以外的所有字符

   * noecho()

     使键盘输入的字符不需要直接在屏幕上显示


1.2.3 颜色处理

---------------

   * 使用函数has_colors()判断终端是否支持彩色

   * 使用init_pair(0,COLOR_GREEN,COLOR_BLACK)初始化颜色配对表,设置字符的前景色和背景色

   * 使用attron(A_BLINK|COLOR_PAIR(2))设置要显示的字符如何显示


1.2.4 使用refresh和wrefresh进行屏幕更新

----------------------------------------

   * refresh其实是wrefresh(stdscr)的宏定义


1.2.5 使用endwin()函数中断curses程序

-------------------------------------

   * endwin()是程序最后调用的一个函数,与initscr()相呼应

   * endwin()执行后,光标移动到屏幕的左下方


1.3 编译

=========

  * 如果程序使用了panel,menu,form等库,-lcurses选项必须在其余的选项之后


1.4 例子

=========


#include <curses.h>
  static void finish(int sig);
  int main()
  {
      initscr();
      keypad(stdscr,TRUE);
      nonl();
      cbreak();
      noecho();
      if(has_colors())
      {
          start_color();
          init_pair(0,COLOR_BLACK,COLOR_BLACK);
          init_pair(1,COLOR_GREEN,COLOR_BLACK);
          init_pair(2,COLOR_RED,COLOR_BLACK);
          init_pair(3,COLOR_CYAN,COLOR_BLACK);
          init_pair(4,COLOR_WHITE,COLOR_BLACK);
          init_pair(5,COLOR_MAGENTA,COLOR_BLACK);
          init_pair(6,COLOR_BLUE,COLOR_BLACK);
          init_pair(7,COLOR_YELLOW,COLOR_BLACK);
      }
      attron(A_BLINK|COLOR_PAIR(2));
      move(LINES/2+1,COLS-4);
      addstr("Eye");
      refresh();
      sleep(2);
      move(LINES/2-3,COLS/2-3);
      addstr("Bulls");
      refresh();
      sleep(2);
      finish(0);
  }
  static void finish(int sig)
  {
      endwin();
      exit(0);
  }