1. 基础知识
   在使用鼠标之前,首先要调用mousemask( )这个函数来激活你想要接收的鼠标事件。
mousemask( mmask_t newmask, /* 你想要监听的鼠标事件掩码*/
mmask_t *oldmask ) /* 旧版本使用的鼠标事件掩码*/
上述函数中的第一个参数,就是你所要监听的事件的位掩码,默认情况下,在使用该函数之
前,所有鼠标事件的接收状态都是未激活的。位掩码ALL_MOUSE_EVENTS 可以让鼠标
接收所有的事件。
下面是NCURSES 定义的位掩码清单:(注意:不同的鼠标按键号码设置不同,使用前需要
测试。一般情况下左键为1 号,右键为2 号)
掩码对应事件

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 报告鼠标移动位置

2. 取得鼠标事件
当所有的鼠标监听事件被激活后。getch()一类的函数在每次接收到的鼠标事件时可以返回
KEY_MOUSE。然后通过getmouse()函数可以取得这些事件。
代码大概看起来是这样:
MEVENT event;
ch = getch();
if(ch == KEY_MOUSE)
    if(getmouse(&event) == OK)
    {
        . /* 处理这个事件的代码*/
    }
……
getmouse()函数将这个事件返回一个相应的指针。这个指针结构是这样的:
typedef struct
{
    short id; /* ID 用来辨别不同的设备*/
    int x, y, z; /* 事件发生的坐标*/
    mmask_t bstate; /* 鼠标按键状态*/
}
Bstate 是我们关注的最主要变量,它返回了当前鼠标按键的状态。下面的这段代码可以让
我们看看按下鼠标左键会出现什么:
if(event.bstate & BUTTON1_PRESSED)

printw("Left Button Pressed");

3 .把它们放在一起
    能够使用鼠标操作的程序是非常棒的,让我们做用鼠标操作的菜单程序。为了让例子看起来

更有针对性,这个程序中去掉了键盘操作:

#include <ncurses.h>
#include <string.h>
#define WIDTH 30
#define HEIGHT 10
int startx = 0;
int starty = 0;
char *choices[] ={"Choice 1","Choice 2","Choice 3","Choice 4","exit"};
int n_choices = sizeof(choices)/sizeof(char *);void print_menu(WINDOW *menu_win,int highlight)
{int x,y,i;x = 2;y = 2;box(menu_win,0,0);for(i = 0;i < n_choices;i++){if(highlight == i + 1){wattron(menu_win,A_BOLD|A_BLINK);mvwprintw(menu_win,y,x,"%s",choices[i]);wattroff(menu_win,A_BOLD|A_BLINK);}elsemvwprintw(menu_win,y,x,"%s",choices[i]);++y;}wrefresh(menu_win);
}void report_choice(int mouse_x,int mouse_y,int *p_choice)
{int i,j,choice;i = startx + 2;j = starty + 3;for(choice = 0;choice < n_choices;++choice){if(mouse_y == j + choice && mouse_x >= i && mouse_x <= i + strlen(choices[choice])){if(choice == n_choices - 1)*p_choice = -1;else*p_choice = choice + 1;break;}}
}int main(int argc, char **argv)
{int c,choice = 0;WINDOW *menu_win;MEVENT event;initscr();clear();noecho();cbreak();startx = (80 - WIDTH)/2;starty = (24 - HEIGHT)/2;attron(A_REVERSE);mvprintw(23,1,"Click on exit to quit(Work best in a vitual console)");refresh();attroff(A_REVERSE);menu_win = newwin(HEIGHT,WIDTH,starty,startx);print_menu(menu_win,1);mousemask(ALL_MOUSE_EVENTS,NULL);while(1){c = wgetch(menu_win);switch(c){case KEY_MOUSE:if(getmouse(&event) == OK){if(event.bstate == BUTTON1_PRESSED){report_choice(event.x + 1,event.y + 1,&choice);if(choice == -1)goto end;mvprintw(22,1,"Choice made is : %d string chosen is \"%10s\"",choices[choice - 1]);break;}}}}
end :endwin();return 0;
}

Ncurses学习经历(八) 使用鼠标操作相关推荐

  1. selenium webdriver学习(八)------------如何操作select下拉框(转)

    selenium webdriver学习(八)------------如何操作select下拉框 博客分类: Selenium-webdriver 下面我们来看一下selenium webdriver ...

  2. 【学习OpenCV4】键盘鼠标操作总结

    本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...

  3. Ncurses学习经历(一) Ncurses简介与下载安装

    1.NCURSES 是什么? 你可能会疑惑,引入的这些技术术语是什么.假设在使用termcap 或者terminfo 的情况下, 每个应用程序都在访问terminfo 数据库并且做一些必要的处理(比如 ...

  4. Ncurses学习经历(二) 编译包含ncurses库函数的程序

    如果要调用ncurses 库中的函数,你必须在代码中加载ncurses.h 文件,就是要在C 或C++ 程序开头添加"#include <ncurses.h>",然后在 ...

  5. Ncurses学习经历(五)窗口机制详述

    九.窗口机制     窗口(Window)机制是整个curses 系统的核心.通过前面的例子我们看到了基于"标准窗 口"(stdscr)的一些操作函数.即使设计一个最简单的图形用户 ...

  6. Mr.J-- jQuery学习笔记(八)--CSS样式操作

    CSS属性操作 在jQuery中,关于元素的样式操作方法共有2种: (1)CSS属性操作: (2)CSS类名操作: 三种设置方法 逐个设置 $("div").css("w ...

  7. Ncurses学习经历(十三)菜单系统的核心

    如你在上面的例子中所看到的,menu_driver 在更新菜单时有着举足轻重的作用.所以了解 它的各个选项和它们的作用就很有必要了.前面已经解释过,menu_driver()的第二个参数 可以是一个导 ...

  8. BBB学习(八):操作BBB普通IO口

    一.前言 在linux系统中,一切设备都是以文件形式存在,因此其有一个中心思想是"一切都是文件"(当然除了网络设备是用套接字方式之外).在接下来的文章中会操作BBB相关硬件接口(g ...

  9. JavaScript学习(八)—属性节点和属性值的操作

    JavaScript学习(八)-属性节点和属性值的操作 方式一: 利用元素节点的attributes属性来获取该元素身上所有的属性 格式1:元素节点.attributes 返回值:返回值为所有属性的节 ...

最新文章

  1. ISME:基于大数据准确预测土壤的枯萎病发生
  2. 理解ROS话题---ROS学习第5篇
  3. cephfs 挂载 卸载
  4. if condition 大于_小函数,大用处!巧用AND函数,避开IF函数嵌套
  5. Session的底层实现原理
  6. 作者:孙卫强,博士,上海交通大学教授、博士生导师。
  7. OwlCarousel.js 帮助API
  8. 知乎内容营销新动作:别处种草 知乎种树
  9. lg手机历史机型_LG手机业务亏损增加70% 宣称主因是国产品牌卖的太便宜
  10. java根据身份证号判断当前年龄
  11. js代码实现百度换肤
  12. Python导入excel数据
  13. 关于微信开放平台配置-网站应用
  14. 增量式与绝对值编码器的区别
  15. 和包贷是什么?究竟如何
  16. ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)
  17. Apache运维中常用功能配置笔记梳理
  18. 固定资产的日期之接管日期
  19. 计算机网络技术专业学生自我介绍,计算机网络专业大学生面试自我介绍范文
  20. 生成带参数的微信二维码

热门文章

  1. python3GUI--天气预报小工具By:PyQt5(附源码)
  2. cad图形不见了怎么办_CAD崩溃了,怎么找回丢失的CAD图纸?别慌,老师傅教你几招...
  3. 微信小程序使用高德地图Web服务爬取企业数据
  4. 物理机与虚拟机共享文件
  5. 频谱分析仪双音法的原理
  6. 字根科技-政府网站错别字检测的新选择
  7. matlab无刷双馈电机模型搭建,无刷双馈电机建模及智能控制策略研究
  8. charles使用(安装、mock、限速、断点功能)
  9. 舆情智慧决策闭环管理
  10. idear 打jar包报错:jar中没有主清单属性 的一种解决办法