• Linux学习笔记13——使用curses函数库


    一 安装curses库

      如果你的Linux系统中curses库,直接敲入命令sudo apt-get install libncurses5-dev然后就会自动安装curses库,安装好之后敲入命令:

      ls -l /usr/include/*curses.h,我上面显示的是这样:

    二 curses库有什么作用

     curses函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。

    三 认识curses库

      1:curses函数库用两个数据结构来映射终端屏幕,它们是stdscr和curscr。

         stdscr数据结构对应的是标准屏幕(在窗口下,这个一般作为窗口的指针)

         curscr对应的是当前屏幕

      2:所有的curses函数使用的坐标都是y值(行号)在前,x值(列号)在后。每个位置不仅包含该屏幕位置处的字符,还包含它的属性。

      3:所有的curses程序必须以initscr函数开始,以endwin函数结束    

    #include <curses.h>
    WINDOW *initscr(void);//initscr函数在一个程序中只能调用一次,如果成功,它返回一个指向stdscr结构的指针;如果失败,它就输出一条诊断错误信息并使程序退出
    int endwin(void);

      4 输出到屏幕

    #include <curses.h>
    int addch(const chtype char_to_add);                      //在光标的当前位置添加指定的字符
    int addchstr(chtype *const string_to_add);                   //在光标的当前位置添加指定的字符串
    int printw(char *format,...);                          //对字符串进行格式化,然后将其添加到光标的当前位置 int refresh(void);                                 //刷新物理屏幕 int box(WINDOW *win_ptr,chtype vertical_char,chtype horizontal_char);   //围绕一个窗口绘制方框 int insch(chtype char_to_insert);                         //插入一个字符 int insertln(void);                                //插入一个空白行 int delch(void);                                  //删除一个字符 int deleteln(void);                                //删除一个空白行 int beep(void);                                   //发出蜂鸣 int flash(void);                                  //使屏幕闪烁

      5 从屏幕读取

    #include <curses.h>
    chtype inch(void);    //返回光标当前位置的字符及其属性信息

      6 清除屏幕

    #include <curses.h>
    int erase(void);      //在每个屏幕位置写上空白字符
    int clear(void);      //清除整个屏幕,而不是尝试删除当前屏幕上每个非空白的位置
    int clrtobot(void);    //清除当前坐标位置直到屏幕结尾的所有内容
    int clrtoeol(void);    //清除当前坐标位置直到坐标所处行行尾的所有内容

      7 移动坐标

    #include <curses.h>
    int move(int new_y,int new_x);               //移动逻辑光标
    int leaveok(WINDOW *window_ptr,bool leave_flag); //leave_flag默认为false,表示硬件光标将停留在逻辑光标所处的位置,
                                 //如果该标志被设置为true,则硬件光标会被随机的放置在屏幕上的任意位置

      8 字符属性

    #include <curses.h>
    int attron(chtype attribute);      //启用指定的属性
    int attroff(chatype attribute);     //关闭指定的属性
    int attrset(chtype attribute);
    int standout(void);            
    int standend(void);

      预定义的属性有:A_BLINK A_BOLD A_DIM A_REVERSE A_STANDOUT 和A_UNDERLINE

      9 键盘输入

    #include <curses.h>
    int getch(void);
    int getstr(char *string);                  //对返回的字符串的长度没有限制
    int getnstr(char *string,int number_of_characters);  //对返回的字符串长度有限制,尽量用这个函数取代getstr函数
    int scanw(char *format,...);

      10 窗口

    #include <curses.h>
    WINDOW *newwin(int num_of_lines,       //行数
                  int num_of_cols,         //列数
                  int start_y,           //起始坐标y值
                  int start_x        //起始坐标x值
            );              //创建窗口,如果新窗口的任何部分落在当前屏幕范围之外,则newwin函数调用将失败
    int delwin(WINDOW *window_to_delete);  //删除窗口

      11 关于加前缀

        如果给函数增加了w前缀,就必须在该函数的参数表的最前面增加一个WINDOW指针参数
        如果给函数增加的是mv前缀,则需要在函数的参数表的最前面增加两个参数,分别是纵坐标y和横坐标x,坐标值y和x是相对于窗口的
        如果给函数增加了mvw前缀,就需要多传递3个参数,分别是一个WINDOW指针,y和x坐标值

      12 移动和更新窗口

    #include <curses.h>
    int mvwin(WINDOW *window_to_move,int new_y,int new_y);  //在屏幕上移动一个窗口
    int wrefresh(WINDOW *window_ptr);
    int wclear(WINDOW *window_ptr);
    int werase(WINDOW *window_ptr);                //wrefresh,wclear,werase分别是前面refresh,clear,erase的通用版本
    int touchwin(WINDOW *window_ptr);                //通知curses函数库其指针参数指向的窗口内容已发生改变
    int scrollok(WINDOW *window_ptr,bool scroll_flag);    //如果scroll_flag为true,则允许窗口卷屏
    int scroll(WINDOW *window_ptr);               //把窗口内容上卷一行

      13 优化屏幕刷新

    #include <curses.h>
    int wnoutrefresh(WINDOW *window_ptr);    //决定哪些字符发送到屏幕上,但是不真正发送
    int doupdate(void);              //将更新发送到终端,效果和wrefresh一样

      14 子窗口

    #include <curses.h>
    WINDOW *subwin(WINDOW *parent,int num_of_lines,int num_of_cols,int start_y,int start_x);  //创建子窗口
    int delwin(WINDOW *window_to_delete);                                //删除子窗口

      子窗口和新窗口之间的区别:子窗口没有自己独立的屏幕字符存储空间,它们与其父窗口共享同一字符存储空间,因此对子窗口中内容的任何修改都会反映到其父窗口中
      子窗口的用途:提供了一种简洁的方式来卷动另一个窗口里的部分内容
      对子窗口的限制:在应用程序刷新屏幕之前必须先对其父窗口调用touchwin函数

      15 keypad模式

    #include <curses.h>
    int keypad(WINDOW *window_ptr,bool keypad_on);  //keypad_on为true时,开启keypad模式

      在keypad模式下,curses将接管按键转义序列的处理工作,该键盘操作不仅能够返回用户按下的键,还将返回与逻辑按键对应的KEY_定义

      16 彩色显示
      在使用curses函数库的颜色功能之前,必须检查当前终端是否支持彩色显示功能,然后对curses的颜色例程进行初始化

    #include <curses.h>
    bool has_colors(void);
    int start_color(void);//has_colors函数返回true时在调用这个函数

      颜色组合:在使用curses的颜色功能时,必须同时定义一个字符的前景色和背景色
      在把颜色作为属性使用之前,必须首先调用init_pair函数对准备使用的颜色组合进行初始化

    #include <curses.h>
    int init_pair(short pair_number,                           //颜色对的编号
            short foreground,                           //前景色
            short background);                           //背景色
    int COLOR_PAIR(int pair_number);                          //使用指定的着色方式
    int pair_content(short pair_number,short *foreground,short *background);  //获取已定义的颜色组的信息

      例如:init_pair(1,COLOR_RED,COLOR_GREEN);    //颜色都是以COLOR_开头
           wattron(window_ptr,COLOR_PAIR(1));      //将该颜色组合作为属性来访问,把屏幕上后续添加的内容设置为绿色背景上的红色内容

      17 pad

    #include<curses.h>
    WINDOW *newpad(int number_of_lines,int number_of_columns);  //创建pad
    int prefresh(WINDOW *Pad_ptr,
            int pad_row,
            int pad_column,
            int screen_row_min,
            int screen_col_min,
            int screen_row_max,
            int screen_col_max        );//指定希望放到屏幕上的pad范围及其在屏幕上的位置

      18 编译时,需要在命令后面加上-lcurses,否在会出现“undefined reference to”的错误。

  • 相关阅读:
    ruby -- 修改rubymine的字体大小
    ruby -- 基础学习(二) 外键配置实现级联删除
    ruby -- 基础学习(一)项目文件夹说明
    ruby -- 问题解决(二)rails4.0create引起的ActiveModel::ForbiddenAttributesError错误
    ruby -- 问题解决(一)无法连接mysql数据库
    enumerate用法
    python文件调用
    第二天----列表、深浅拷贝、元组、字符串、算数运算、字典、while
    P1005 矩阵取数游戏(动态规划+高精度)
    P1242 新汉诺塔(搜索+模拟退火)
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3482889.html
Copyright © 2020-2023  润新知