鼠标事件有这么多种,手柄的可以忽视,Sdl.SDL_KEYDOWN,Sdl.SDL_KEYUP,Sdl.SDL_MOUSEMOTION,Sdl.SDL_MOUSEBUTTONDOWN,Sdl.SDL_MOUSEBUTTONUP应该是常用的。

  1. public enum EventTypes
  2.  
  3. {
  4.  
  5. /// <summary>
  6.  
  7. /// No event
  8.  
  9. /// </summary>
  10.  
  11. None = Sdl.SDL_NOEVENT,
  12.  
  13. /// <summary>
  14.  
  15. /// Active event
  16.  
  17. /// </summary>
  18.  
  19. ActiveEvent = Sdl.SDL_ACTIVEEVENT,
  20.  
  21. /// <summary>
  22.  
  23. /// Key down event
  24.  
  25. /// </summary>
  26.  
  27. KeyDown = Sdl.SDL_KEYDOWN,
  28.  
  29. /// <summary>
  30.  
  31. /// Key up event
  32.  
  33. /// </summary>
  34.  
  35. KeyUp = Sdl.SDL_KEYUP,
  36.  
  37. /// <summary>
  38.  
  39. /// Mouse Motion event
  40.  
  41. /// </summary>
  42.  
  43. MouseMotion = Sdl.SDL_MOUSEMOTION,
  44.  
  45. /// <summary>
  46.  
  47. /// Mouse button down event
  48.  
  49. /// </summary>
  50.  
  51. MouseButtonDown = Sdl.SDL_MOUSEBUTTONDOWN,
  52.  
  53. /// <summary>
  54.  
  55. /// Mouse button up event
  56.  
  57. /// </summary>
  58.  
  59. MouseButtonUp = Sdl.SDL_MOUSEBUTTONUP,
  60.  
  61. /// <summary>
  62.  
  63. /// Joystick Axis motion event
  64.  
  65. /// </summary>
  66.  
  67. JoystickAxisMotion = Sdl.SDL_JOYAXISMOTION,
  68.  
  69. /// <summary>
  70.  
  71. /// Joystick ball motion event
  72.  
  73. /// </summary>
  74.  
  75. JoystickBallMotion = Sdl.SDL_JOYBALLMOTION,
  76.  
  77. /// <summary>
  78.  
  79. /// Joystick hat motion event
  80.  
  81. /// </summary>
  82.  
  83. JoystickHatMotion = Sdl.SDL_JOYHATMOTION,
  84.  
  85. /// <summary>
  86.  
  87. /// Joystick button down event
  88.  
  89. /// </summary>
  90.  
  91. JoystickButtonDown = Sdl.SDL_JOYBUTTONDOWN,
  92.  
  93. /// <summary>
  94.  
  95. /// joystick button up event
  96.  
  97. /// </summary>
  98.  
  99. JoystickButtonUp = Sdl.SDL_JOYBUTTONUP,
  100.  
  101. /// <summary>
  102.  
  103. /// Video resize event
  104.  
  105. /// </summary>
  106.  
  107. VideoResize = Sdl.SDL_VIDEORESIZE,
  108.  
  109. /// <summary>
  110.  
  111. /// Video expose event
  112.  
  113. /// </summary>
  114.  
  115. VideoExpose = Sdl.SDL_VIDEOEXPOSE,
  116.  
  117. /// <summary>
  118.  
  119. /// Quit event
  120.  
  121. /// </summary>
  122.  
  123. Quit = Sdl.SDL_QUIT,
  124.  
  125. /// <summary>
  126.  
  127. /// Window manager event
  128.  
  129. /// </summary>
  130.  
  131. WindowManagerEvent = Sdl.SDL_SYSWMEVENT,
  132.  
  133. /// <summary>
  134.  
  135. /// user-defined event
  136.  
  137. /// </summary>
  138.  
  139. UserEvent = Sdl.SDL_USEREVENT
  140.  
  141. }

鼠标点击后的button:

  1. public enum MouseButton
  2.  
  3. {
  4.  
  5. /// <summary>
  6.  
  7. /// None
  8.  
  9. /// </summary>
  10.  
  11. None = ,
  12.  
  13. /// <summary>
  14.  
  15. /// Primary button. Typically the left button
  16.  
  17. /// </summary>
  18.  
  19. PrimaryButton = Sdl.SDL_BUTTON_LEFT,
  20.  
  21. /// <summary>
  22.  
  23. /// Secondary button. typically the right button
  24.  
  25. /// </summary>
  26.  
  27. SecondaryButton = Sdl.SDL_BUTTON_RIGHT,
  28.  
  29. /// <summary>
  30.  
  31. /// Middle button
  32.  
  33. /// </summary>
  34.  
  35. MiddleButton = Sdl.SDL_BUTTON_MIDDLE,
  36.  
  37. /// <summary>
  38.  
  39. /// Wheel up
  40.  
  41. /// </summary>
  42.  
  43. WheelUp = Sdl.SDL_BUTTON_WHEELUP,
  44.  
  45. /// <summary>
  46.  
  47. /// Wheel down
  48.  
  49. /// </summary>
  50.  
  51. WheelDown = Sdl.SDL_BUTTON_WHEELDOWN
  52.  
  53. }

常用的代码写法

  1. while (!quit) //建立事件主循环
  2.  
  3. {
  4.  
  5. while (Sdl.SDL_PollEvent(out ev) == )//从队列里取出事件
  6.  
  7. {
  8.  
  9. Sdl.SDL_WaitEvent(out ev); //必须等待
  10.  
  11. if (ev.type == Sdl.SDL_MOUSEBUTTONDOWN)
  12.  
  13. {
  14.  
  15. if (ev.button.button == Sdl.SDL_BUTTON_LEFT)
  16.  
  17. {
  18.  
  19. MouseDown(ev.button);
  20.  
  21. }
  22.  
  23. else
  24.  
  25. if (ev.button.button ==Sdl.SDL_BUTTON_RIGHT)
  26.  
  27. {
  28.  
  29. }
  30.  
  31. }
  32.  
  33. else
  34.  
  35. if (ev.type == Sdl.SDL_MOUSEMOTION)
  36.  
  37. {
  38.  
  39. MouseMove (ev.button);
  40.  
  41. }
  42.  
  43. else
  44.  
  45. if (ev.type == Sdl.SDL_MOUSEBUTTONUP)
  46.  
  47. {
  48.  
  49. if (ev.button.button ==Sdl.SDL_BUTTON_LEFT)
  50.  
  51. {
  52.  
  53. MouseUp (ev.button);
  54.  
  55. }
  56.  
  57. }
  58.  
  59. else
  60.  
  61. if (ev.type ==Sdl.SDL_VIDEORESIZE)
  62.  
  63. {
  64.  
  65. }
  66.  
  67. else
  68.  
  69. if (ev.type ==Sdl.SDL_QUIT)
  70.  
  71. {
  72.  
  73. quit = true;
  74.  
  75. break;
  76.  
  77. }
  78.  
  79. }
  80.  
  81. }

在处理SDL的事件有两种模式,一种是等待 SDL_WaitEvent,另一种是轮询SDL_PollEvent

目前,在网上可以查到的文章,大多数都使用了轮询,还有人指出等待有时会导致事件处理延迟。但是我在实际coding中,使用SDL_PollEvent,一运行就风扇不停的转,用top看了下,cpu占用到了99%。

实际上,使用wait已经足够,我不大清楚这种轮询机制在什么时候会用到。

以下是一个SDL_PollEvent的原型。分析一下这段程序:

在while(quit!=1)这个循环中,如果没有发生任何事件,quit始终为0,那么在用户没有任何操作的情况下,这里会无限循环,直到event发生,进入了SDL_PollEvent的循环中。

这就导致了cpu占用率达到了100%. 因此,这种方法是不可取的。

在外层有循环时,SDL_PollEvent论询是不能用的。如果单独使用,用户无操作的时候,又无法进入处理事件的部分。实在不能明白它有什么用。

我考虑是不是这个应该用在非实时处理的时候,比如while(quit!=1)循环中嵌入一个sleep(1)之类。

  1. void WaitKeyboard(SubWin sw){
  2.  
  3. int quit = ;
  4.  
  5. SDL_Event event;
  6.  
  7. KEYBOARDMODE kmode = COMMAND;
  8.  
  9. while(quit!=){
  10.  
  11. // printf ( "waiting for keyboard action\n" );
  12.  
  13. while( SDL_PollEvent(&event)){
  14.  
  15. printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
  16.  
  17. switch (event.type){
  18.  
  19. case SDL_KEYDOWN:
  20.  
  21. printf ( "tracking keydown\n" );
  22.  
  23. kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
  24.  
  25. break;
  26.  
  27. case SDL_QUIT:
  28.  
  29. printf("Stop !\n");
  30.  
  31. quit = ;
  32.  
  33. break;
  34.  
  35. }
  36.  
  37. }
  38.  
  39. }
  40.  
  41. endSDL();
  42.  
  43. }

接下来是SDL_WaitEvent的原型

在while(quit!=1)的循环中,由于SDL_WaitEvent语句,在用户未发生任何操作前,程序处于等待状态,不会进入下一次循环,这样就避免了cpu占用的问题。

这样的做法才是正确处理SDL事件的方法。

  1. void WaitKeyboard(SubWin sw){
  2.  
  3. int quit = ;
  4.  
  5. SDL_Event event;
  6.  
  7. KEYBOARDMODE kmode = COMMAND;
  8.  
  9. while(quit!=){
  10.  
  11. // printf ( "waiting for keyboard action\n" );
  12.  
  13. // while( SDL_PollEvent(&event)){
  14.  
  15. SDL_WaitEvent(&event);
  16.  
  17. printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
  18.  
  19. switch (event.type){
  20.  
  21. case SDL_KEYDOWN:
  22.  
  23. printf ( "tracking keydown\n" );
  24.  
  25. kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
  26.  
  27. break;
  28.  
  29. case SDL_QUIT:
  30.  
  31. printf("stop !\n");
  32.  
  33. quit = ;
  34.  
  35. break;
  36.  
  37. }
  38.  
  39. }
  40.  
  41. endSDL();
  42.  
  43. }

http://blog.chinaunix.net/uid-26456800-id-3337795.html

SDL鼠标事件的更多相关文章

  1. 7.JAVA之GUI编程鼠标事件

    鼠标事件: 功能: 1.基本窗体功能实现 2.鼠标移动监听,当鼠标移动到按钮上时,触发打印事件. 3.按钮活动监听,当按钮活动时,触发打印事件. 4.按钮被单击时触发打印事件. 源码如下: impor ...

  2. 手持设备点击响应速度,鼠标事件与touch事件的那些事

    前言 现在一直在做移动端的开发,这次将单页应用的网页内嵌入了app,于是老大反映了一个问题:app应用点击响应慢!我开始不以为然,于是拿着网页版的试了试,好像确实有一定延迟,于是开始了研究,最后选择了 ...

  3. css屏蔽元素的鼠标事件pointer-events

    // 屏蔽点击 $('body').css('pointer-events', 'none'); //恢复默认 $('body').css('pointer-events', 'auto');   用 ...

  4. 深入学习jQuery鼠标事件

    × 目录 [1]类型 [2]写法 [3]合成事件[4]鼠标按键[5]修改键[6]坐标位置 前面的话 鼠标事件是DOM事件中最常用的事件,jQuery对鼠标事件进行了封装和扩展.本文将详细介绍jQuer ...

  5. 深入理解DOM事件类型系列第一篇——鼠标事件

    × 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...

  6. winform/窗体鼠标事件编程中的几个问题

    1.进行.net窗体的开发,经常用到鼠标事件,如MouseDown/MouseUp/MouseMove/MouseClick等.可是有时候给控件添加鼠标事件,就是不响应,怎么办呢! 答案:1.控件是否 ...

  7. JQuery事件之鼠标事件

    鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击时触发的. ():click事件:click事件于用户在元素敲击鼠标左键,并在相同元素上松开左键时触发. $('p').click(function( ...

  8. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

  9. Extjs 窗体居中,双重窗体弹出时清除父窗体的鼠标事件

    这个是监控窗体缩放的事件 缩放中居中主要在 'beforeshow' 和 'destroy'两个事件里面监控 var EditTempWindow; Ext.EventManager.onWindow ...

随机推荐

  1. Hive官方手册翻译(Getting Started)

    翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的.如有疑问,请参照Hive官方文档对照查看.   内容列表 Cloudera制作的Hive介绍视频 ...

  2. Python简单爬虫入门二

    接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们Bea ...

  3. map.c 添加注释

    注释仅代表个人理解,难免有错误之处,仅供参考!   1 /*   2  *  linux/drivers/base/map.c   3  *   4  * (C) Copyright Al Viro  ...

  4. x01.os.19: linux 0.0

    linux 0.0 是一个丢失的版本,但赵炯老师又在 linux 0.11 的基础上,使它起死回生.www.oldlinux.org 有大量资源可供下载,值得一看. 1.要编译运行,首先需安装:sud ...

  5. Android 上实现像微信一样的用Fragment来实现的Tab切页效果 提供源码下载

    网有不少的例子,但是要么是像微信一样可是没有使用Fragment实现,要么是只实现了一个很简单的切换,没有下面的菜单页.这个例子有实现了,我觉得暂时够我用了##实现类:+ MainTabFragmen ...

  6. OpenStack云计算快速入门之一:OpenStack及其构成简介

    原文:http://blog.chinaunix.net/uid-22414998-id-3263551.html OpenStack云计算快速入门(1) 该教程基于Ubuntu12.04版,它将帮助 ...

  7. Ubuntu 部署Postgresql

    安装组件 客户端安装 sudo apt-get install postgresql-client 服务器安装 sudo apt-get install postgresql postgresql-c ...

  8. 我也来谈一谈c++模板(一)

    c++中程序员使用模板能够写出与类型无关的代码,提高源代码重用,使用合适,大大提高了开发效率.此前,可以使用宏实现模板的功能,但是模板更加安全.清晰.在编写模板相关的代码是我们用到两个关键词:temp ...

  9. Release Management 安装 之 集成TFS

    集成TFS时需要在TFS服务器执行 tfssecurity /g+ "Team Foundation Service Accounts" n:ALM\rmtfsint ALLOW ...

  10. BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4201  Solved: 1851[Submit][Stat ...