OSG的消息机制包括好多个头文件预定义及多个类。

  首先,消息接收相关的类当属osgGA::GUIEventHandler和osgGA::GUIEventAdapter这两个类了。前者处理OSG程序与用户交互,处理事件,事件全靠handle这个函数。此函数的定义:

重载1: virtual bool handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv);

重载2: virtual bool handle(const GUIEventAdapter& ea,GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*) { return handle(ea,aa); }

重载3:  virtual bool handle(const GUIEventAdapter&,GUIActionAdapter&) { return false; }

const GUIEventAdapter&ea用来控制事件类型,GUIActionAdapter用来获得viewer和视口以及上下文,还可以传入一个额外的类object,还可以传入一个Nodevisitor,一般只用前两个参数即可,我们多数情况下运用的也是这两个参数,ea主要用来控制所得到的事件类型,aa用于控制场景viewer以及上下文,窗口等等,可以自定义一些场景变换。

  注意,我们大多数情况下用的是重载函数3,股沟进行事件类型及信息获取和控制场景viewer以及上下文,窗口等。

  const GUIEventAdapter中有一个重要的枚举类型

enum EventType {
            NONE                = 0,
            PUSH                = 1<<0,
            RELEASE             = 1<<1,
            DOUBLECLICK         = 1<<2,
            DRAG                = 1<<3,
            MOVE                = 1<<4,
            KEYDOWN             = 1<<5,
            KEYUP               = 1<<6,
            FRAME               = 1<<7,
            RESIZE              = 1<<8,
            SCROLL              = 1<<9,
            PEN_PRESSURE        = 1<<10,
            PEN_ORIENTATION     = 1<<11,
            PEN_PROXIMITY_ENTER = 1<<12,
            PEN_PROXIMITY_LEAVE = 1<<13,
            CLOSE_WINDOW        = 1<<14,
            QUIT_APPLICATION    = 1<<15,
            USER                = 1<<16
        };

  具体事件对应为:

OSG中常用的事件类型
代码	值	事件类型
NONE	0	无事件
PUSH	1	鼠标某键按下
RELEASE	2	鼠标某键弹。
DOUBLECLICK	4	鼠标某键双击
一般视为1代表左键,2代表中键,4代表右键。枚举类型MouseButtonMask
DRAG	8	鼠标某键拖动
MOVE	16	鼠标移动
KEYDOWN	32	键盘上某键按下
KEYUP	64	键盘上某键弹起
FRAME	128	图像帧(与时间有关)
RESIZE	256	窗口大小改变时会有的事件
SCROLL	512	鼠标轮滚动
PEN_PRESSURE	     1024	手写板的某事件
PEN_PROXIMITY_ENTER	2048	手写板的某事件
PEN_ORIENTATION 	4096	手写板的某事件
PEN_PROXIMITY_LEAVE	8192	手写板的某事件
CLOSE_WINDOWS	     16384	关闭窗口
QUIT_APPLICATION     32768	退出程序
USER              65536   用户定义

  按键值就是对应的ASCLL码。

OSG消息机制之事件处理概述的更多相关文章

  1. OSG消息机制之消息分析

    OSG消息接收在头文件有各种事件的相关参数

  2. Windows消息机制概述

    消息是指什么?     消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程 ...

  3. 【原创】源码角度分析Android的消息机制系列(一)——Android消息机制概述

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.为什么需要Android的消息机制 因为Android系统不允许在子线程中去访问UI,即Android系统不允许在子线程中更新UI. 为什 ...

  4. 聊一聊Android的消息机制

    聊一聊Android的消息机制 侯 亮 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和消息机制,前者用于跨进程通信,后者用于进程内部通信. 从技术实现上来说,消息机制还是比 ...

  5. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  6. 【温故Delphi】之VCL消息机制小结

    TObject消息分派 procedure Dispatch(var Message); virtual; #负责分派消息到特定VCL组件的事件处理函数 procedure DefaultHandle ...

  7. 【转】深入Windows内核——C++中的消息机制

    上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图  Win32 ...

  8. C#.NET 消息机制

    一.消息概述 众人周知,window系统是一个消息驱动的系统, windows操作系统本身有自己的消息队列,消息循环,它捕捉键盘,鼠标的动作生成消息,并将这个消息传给应用程序的消息队列. 余下的工作有 ...

  9. android学习日记25--ANR和Hander消息机制

    1.ANR(Application Not Responding)定义 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:A ...

随机推荐

  1. Java中Runnable和Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  2. Android获取位置信息的方法总结

    1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综 ...

  3. c#过滤html标签

    public string HtmlFilter(string html)     {         //设置要删除的标记         string[] lable = { "font ...

  4. 耿丹CS16-2班第五次作业汇总

    Deadline: 2016-10-26 23:59 作业内容 实验4-1 求1到20的阶乘的和,其中求阶乘用函数完成. 实验4-2 写一个判素数的函数,在主函数输入一个整数,输出其是否是素数的信息. ...

  5. Js计算当前日,当前周开始结束时间,当前月份,当前年份

    <script type="text/javascript"> //日期加上天数后的新日期. function GetDateStr(AddDayCount) { va ...

  6. 微软往年校招招面试题AC全解。

    因为4月初要参加微软的online.所以今天把微软的面试题拿出来做了,自己解答了题目.下面附上我的解答代码. -----------16年9月校招:  第一道题:Farthest Point(最远的整 ...

  7. Linux下安装jetty服务器

    jetty和我们通常使用的tomcat一样,是一个开源的servlet容器,特点是轻量易部署,一方面jetty可以作为web容器使用,另一方面也是最一般的方式是jetty以一组jar包的形式发布,所以 ...

  8. ubuntu 加载新硬盘或分区

    查看目前挂载情况 df -lh 查看新的空间或硬盘 fdisk -lu 新硬盘分区 fdisk /dev/sda 输入m 根据提示输入n(创建一个分区) 然后输入e(扩展分区) 输入分区数1 然后指定 ...

  9. java多线程wait notify join

    wait notify 几个注意点: wait 与 notify/notifyAll 方法必须在同步代码块中使用,即要先对调用对象加锁. 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进 ...

  10. C# 动态调用DLL库

    最近经常用到C#动态调用类库,简单的做下记录方便以后查询. 使用下面的几行代码就可以简单实现DLL类库的调用了 using System.Reflection; // 引入该命名空间 // 获取roc ...