现在的位置: 首页 > 综合 > 正文

SDL使用触屏模拟鼠标点击事件

2013年08月18日 ⁄ 综合 ⁄ 共 2016字 ⁄ 字号 评论关闭

SDL提供了下面几个结构体用于实现鼠标移动、点触等事件。
一个主要的共同体SDL_Event,原型如下:
typedef union{
  Uint8 type;
  SDL_ActiveEvent active;
  SDL_KeyboardEvent key;
  SDL_MouseMotionEvent motion;
  SDL_MouseButtonEvent button;
  SDL_JoyAxisEvent jaxis;
  SDL_JoyBallEvent jball;
  SDL_JoyHatEvent jhat;
  SDL_JoyButtonEvent jbutton;
  SDL_ResizeEvent resize;
  SDL_ExposeEvent expose;
  SDL_QuitEvent quit;
  SDL_UserEvent user;
  SDL_SysWMEvent syswm;
} SDL_Event;
SDL_Event是所有SDL事件处理的核心,它是SDL_Surface之后最重要的结构。它通过判断事件类型(type)来决定选择使用哪一个结构体,它们的对应使用关系如下:

Event type Event Structure
SDL_ACTIVEEVENT SDL_ActiveEvent
SDL_KEYDOWN/UP SDL_KeyboardEvent
SDL_MOUSEMOTION SDL_MouseMotionEvent
SDL_MOUSEBUTTONDOWN/UP SDL_MouseButtonEvent
SDL_JOYAXISMOTION SDL_JoyAxisEvent
SDL_JOYBALLMOTION SDL_JoyBallEvent
SDL_JOYHATMOTION SDL_JoyHatEvent
SDL_JOYBUTTONDOWN/UP SDL_JoyButtonEvent
SDL_VIDEORESIZE SDL_ResizeEvent
SDL_VIDEOEXPOSE SDL_ExposeEvent
SDL_QUIT SDL_QuitEvent
SDL_USEREVENT SDL_UserEvent
SDL_SYSWMEVENT SDL_SysWMEvent

 SDL_Event中有两个用于模拟鼠标设备的动作的结构体SDL_MouseMotionEventSDL_MouseButtonEvent,原型如下:
typedef struct{
  Uint8 type;  //被使用时,为SDL_MOUSEMOTION
  Uint8 state;  //鼠标按键状态
  Uint16 x, y;  //绝对坐标
  Sint16 xrel, yrel;  //相对坐标
} SDL_MouseMotionEvent;
SDL_Event.typeSDL_MOUSEMOTION时,SDL_MouseMotionEvent结构体被选择。SDL_MouseMotionEventSDL_MOUSEMOTION(鼠标移动)事件触发时被使用。简单地说,当用户移动应用程序的窗口内的鼠标或SDL_WarpMouse被引用,SDL_MOUSEMOTION类型的事件就发生。

typedef struct{
  Uint8 type;  //SDL_MOUSEBUTTONDOWNSDL_MOUSEBUTTONUP
  Uint8 which;  //输入设备索引
  Uint8 button;  //鼠标按键索引(SDL_BUTTON_LEFT, SDL_BUTTON_MIDDLE, SDL_BUTTON_RIGHT, SDL_BUTTON_WHEELUP, SDL_BUTTON_WHEELDOWN)
  Uint8 state;  //按键状态(SDL_PRESSEDSDL_RELEASED)
  Uint16 x, y; //按键当前坐标
} SDL_MouseButtonEvent;
SDL_Event.typeSDL_MOUSEBUTTONDOWNSDL_MOUSEBUTTONUP时,SDL_MouseButtonEvent结构体被选择。同样地,SDL_MouseButtonEvent在检测到鼠标按钮按下或释放时使用,鼠标时间发生时鼠标的位置存储在XY字段。

根据触屏数据模拟鼠标点击事件
从触屏获取校正后的点触坐标XY与点触状态pressure,将这些信息相应地填充到SDL_MouseMotionEventSDL_MouseButtonEvent中,再使用SDL_PushEvent装载填充好的结构体,实现鼠标的移动或点击事件。
(注:SDL实现触屏模拟鼠标点击的一个重要的函数:int SDL_PushEvent(SDL_Event *event),该函数用于装载结构体)
详细实现可参考SDL-1.13.4源码。

抱歉!评论已关闭.