![OSG消息机制之事件处理概述 OSG消息机制之事件处理概述](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
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码。