Chinaunix首页 | 论坛 | 博客
  • 博客访问: 808680
  • 博文数量: 296
  • 博客积分: 5376
  • 博客等级: 大校
  • 技术积分: 2298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-14 19:02
文章分类

全部博文(296)

文章存档

2023年(2)

2020年(2)

2018年(2)

2017年(26)

2016年(4)

2015年(19)

2014年(12)

2013年(26)

2012年(84)

2011年(50)

2010年(41)

2009年(28)

分类:

2012-05-18 19:35:47

原文地址:Curses基础编程(五) 作者:visualfan

窗口是Curses编程最重要的部分,也是Curses编程最迷人和实用的组件,这里简单介绍窗口编程的一些基础。


一、窗口基础API

1.WINDOW* newwin(int rows, int cols, int y, int x):其参数分别是新窗口的高和宽,以及左上角开始的坐标,返回一个WINDOW指针表示新窗口

2.delwin(WINDOW *win):删除窗口,释放窗口结构和内存

3.box(WINDOW *win, int , int):在窗口外围划上边框,后两个参数为边框的风格,如box(win, ACS_HLINE, ACS_VLINE)

4.wborder(WINDOW *win, char left, char right, char upper, char down, char left_upper, char right_upper, char left_down, char right_down):同box设置窗口的边框,但可以用字符来分别填充左右上下边线和四个角

5.mvhline(int starty, int startx, char ch, int endx):在starty行输出一行字符ch,从startx到endx

6.mvvline(int starty, int startx, char ch, int endy):同上,只是一列字符



二、颜色控制

1.has_colors():检查终端是否支持彩色模式,不支持则返回FALSE

2.start_color():开启彩色模式,设置颜色前必须调用这个函数,否则颜色也不显示

3.init_pair(int num, CTYPE fore, CTYPE bgd ):Curses中的颜色都是呈对出现的,一个表示前景颜色即字符的颜色,另一个是背景颜色,这个函数生成一个颜色对,后面调用即直接使用num这个颜色对编号来指代这个颜色对

4.COLOR_PAIR(int num):调用init_pair生成的颜色对,如在字符输出前调用attron(COLOR_PAIR(1))即使用颜色对编号1来设置下面输出的字符

5.can_change_color():检测终端是否支持改变或自定义颜色的RGB值,若返回FALSE即不支持,否则可以继续调用init_color来改变系统已有的颜色或设置新的颜色

6.init_color(int color, int r, int g, int b):改变或生成新的颜色color,后面的分别是三原色红绿蓝的值

7.color_content()和pair_content()分别来查看颜色和颜色对设定的值


三、键盘和鼠标控制

1.键盘控制只需要利用getch()或wgetch()函数取键值,然后和功能键与字符键的键值进行比较即可,而鼠标控制有点复杂

2.mousemask(mmask_t newmask, mmask_t* oldmask):在让终端响应鼠标前需要开启相关掩码来激活鼠标响应,简单的就是设置ALL_MOUSE_EVENTS来响应所有的鼠标功能,如:
          掩码                                                   对应事件
BUTTON1_PRESSED                                  鼠标 1 号键按下
BUTTON1_RELEASED                                鼠标 1 号键释放
BUTTON1_CLICKED                                   鼠标 1 号键单击
BUTTON1_DOUBLE_CLICKED                     鼠标 1 号键双击
BUTTON1_TRIPLE_CLICKED                       鼠标 1 号键三击
BUTTON2_PRESSED                                    鼠标 2 号键按下
BUTTON2_RELEASED                                 鼠标 2 号键释放
BUTTON2_CLICKED                                     鼠标 2 号键单击
BUTTON2_DOUBLE_CLICKED                     鼠标 2 号键双击
BUTTON2_TRIPLE_CLICKED                         鼠标 2 号键三击
BUTTON3_PRESSED                                     鼠标 3 号键按下
BUTTON3_RELEASED                                   鼠标 3 号键释放
BUTTON3_CLICKED                                      鼠标 3 号键单击
BUTTON3_DOUBLE_CLICKED                      鼠标 3 号键双击
BUTTON3_TRIPLE_CLICKED                         鼠标 3 号键三击
BUTTON4_PRESSED                                      鼠标 4 号键按下
BUTTON4_RELEASED                                    鼠标 4 号键释放
BUTTON4_CLICKED                                       鼠标 4 号键单击
BUTTON4_DOUBLE_CLICKED                      鼠标 4 号键双击
BUTTON4_TRIPLE_CLICKED                         鼠标 4 号键三击
BUTTON_SHIFT                                             在鼠标事件发生时,伴随 Shift 键按下
BUTTON_CTRL                                               在鼠标事件发生时,伴随 Ctrl 键按下
BUTTON_ALT                                                 在鼠标事件发生时,伴随 Alt 键按下
ALL_MOUSE_EVENTS                                     报告所有的鼠标事件
REPORT_MOUSE_POSITION                           报告鼠标移动位置

相关数据结构:
typedef struct event
{
        short id;   /*ID用来辨别不同的设备*/
        int x, y, z;  /*鼠标事件发生的坐标*/
        mmask_t bstate; /*发生的鼠标事件*/
}

3.鼠标的处理流程一般就为:
   
   MENEVT event;
   mousemask(ALL_MOUSE_EVENTS, NULL); //开启所有的鼠标事件响应
   
   while( getch() == KEY_MOUSE) //鼠标事件发生
   {
        if( getmouse(&event) == OK) //获取鼠标状态
        {
            if (event.bstate & BUTTON1_PRESSED) //检测相应状态和发生坐标
            {
                   ...............  //作具体的处理
             }
         }
    }
   
4.mouse_trafo()和wmouse_trafo()将鼠标的坐标转换为相对应屏幕的坐标,mouseinterval()设置鼠标按下和释放的时间间隔来识别鼠标的单击


四、屏幕控制

1.getyx(WINDOW* win, int y, int x):获得当前光标的坐标

2.getparyx():获得子窗口相对于主窗口的起始坐标

3.getbegyx()和getmaxyx():获取当前窗口的起始坐标和结束坐标

4.scr_dump(char *file)和scr_restore(char *file)分别将屏幕存储和恢复,file为保存文件的名称,用于场景的切换

5.getwin(FILE *fp)和putwin(WINDOW *win, FILE *fp)同上,只是用于存储和恢复窗口

6.copywin():将一个窗口的矩形区域内容复制到另一个窗口的矩形区域,
   copywin(WINDOW *src, WINDOW *dst, int srcminrow, int srcmincol, int dstminrow, int dstmincol, int dmaxrow, int dmaxcol, int over)

其中minrow和mincol分别表示源窗口和目的窗口的起始坐标,而maxrow和maxcol则表示复制的行数和列数,最后over表示是直接覆盖还是重写目的窗口的内容

7. cur_set():设置光标是否可见,0不可见,1可见,2完全可见

8.def_prog_mode():存储Curses模式的一些信息,reset_prog_mode()恢复存储的信息。这两个函数用于临时离开Curses模式,返回默认tty终端模式。
   def_prog_mode(); endwin(); 离开Curses模式,返回tty终端模式
   reset_prog_mode(); refresh(); 恢复Curses模式,一定要调用refresh()才能显示出存储的窗口信息


阅读(1073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~