OSG消息机制之事件处理概述

时间:2023-03-08 16:17:18
OSG消息机制之事件处理概述

  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码。