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

public enum EventTypes

    {

        /// <summary>

        /// No event

        /// </summary>

        None = Sdl.SDL_NOEVENT,

        /// <summary>

        /// Active event

        /// </summary>

        ActiveEvent = Sdl.SDL_ACTIVEEVENT,

        /// <summary>

        /// Key down event

        /// </summary>

        KeyDown = Sdl.SDL_KEYDOWN,

        /// <summary>

        /// Key up event

        /// </summary>

        KeyUp = Sdl.SDL_KEYUP,

        /// <summary>

        /// Mouse Motion event

        /// </summary>

        MouseMotion = Sdl.SDL_MOUSEMOTION,

        /// <summary>

        /// Mouse button down event

        /// </summary>

        MouseButtonDown = Sdl.SDL_MOUSEBUTTONDOWN,

        /// <summary>

        /// Mouse button up event

        /// </summary>

        MouseButtonUp = Sdl.SDL_MOUSEBUTTONUP,

        /// <summary>

        /// Joystick Axis motion event

        /// </summary>

        JoystickAxisMotion = Sdl.SDL_JOYAXISMOTION,

        /// <summary>

        /// Joystick ball motion event

        /// </summary>

        JoystickBallMotion = Sdl.SDL_JOYBALLMOTION,

        /// <summary>

        /// Joystick hat motion event

        /// </summary>

        JoystickHatMotion = Sdl.SDL_JOYHATMOTION,

        /// <summary>

        /// Joystick button down event

        /// </summary>

        JoystickButtonDown = Sdl.SDL_JOYBUTTONDOWN,

        /// <summary>

        /// joystick button up event

        /// </summary>

        JoystickButtonUp = Sdl.SDL_JOYBUTTONUP,

        /// <summary>

        /// Video resize event

        /// </summary>

        VideoResize = Sdl.SDL_VIDEORESIZE,

        /// <summary>

        /// Video expose event

        /// </summary>

        VideoExpose = Sdl.SDL_VIDEOEXPOSE,

        /// <summary>

        /// Quit event

        /// </summary>

        Quit = Sdl.SDL_QUIT,

        /// <summary>

        /// Window manager event

        /// </summary>

        WindowManagerEvent = Sdl.SDL_SYSWMEVENT,

        /// <summary>

        /// user-defined event

        /// </summary>

        UserEvent = Sdl.SDL_USEREVENT

    }

鼠标点击后的button:

public enum MouseButton

    {

        /// <summary>

        /// None

        /// </summary>

        None = ,

        /// <summary>

        /// Primary button. Typically the left button

        /// </summary>

        PrimaryButton = Sdl.SDL_BUTTON_LEFT,

        /// <summary>

        /// Secondary button. typically the right button

        /// </summary>

        SecondaryButton = Sdl.SDL_BUTTON_RIGHT,

        /// <summary>

        /// Middle button

        /// </summary>

        MiddleButton = Sdl.SDL_BUTTON_MIDDLE,

        /// <summary>

        /// Wheel up

        /// </summary>

        WheelUp = Sdl.SDL_BUTTON_WHEELUP,

        /// <summary>

        /// Wheel down

        /// </summary>

        WheelDown = Sdl.SDL_BUTTON_WHEELDOWN

    }

常用的代码写法

while (!quit) //建立事件主循环

            {

                    while (Sdl.SDL_PollEvent(out ev) == )//从队列里取出事件

                    {

                        Sdl.SDL_WaitEvent(out ev); //必须等待

                        if (ev.type == Sdl.SDL_MOUSEBUTTONDOWN)

                        {

                            if (ev.button.button == Sdl.SDL_BUTTON_LEFT)

                            {

                                MouseDown(ev.button);

                            }

                            else

                                if (ev.button.button ==Sdl.SDL_BUTTON_RIGHT)

                                {

                                }

                        }

                        else

                            if (ev.type == Sdl.SDL_MOUSEMOTION)

                            {

                                MouseMove (ev.button);

                            }

                            else

                                if (ev.type == Sdl.SDL_MOUSEBUTTONUP)

                                {

                                    if (ev.button.button ==Sdl.SDL_BUTTON_LEFT)

                                    {

                                        MouseUp (ev.button);

                                    }

                                }

                                else

                                    if (ev.type ==Sdl.SDL_VIDEORESIZE)

                                    {

                                    }

                                    else

                                        if (ev.type ==Sdl.SDL_QUIT)

                                        {

                                            quit = true;

                                            break;

                                        }

                    }

                }

在处理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)之类。

void WaitKeyboard(SubWin sw){

    int quit = ;

    SDL_Event event;

    KEYBOARDMODE kmode = COMMAND;

    while(quit!=){

        //        printf ( "waiting for keyboard action\n" );

     while( SDL_PollEvent(&event)){

        printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );

        switch (event.type){

            case SDL_KEYDOWN:

                printf ( "tracking keydown\n" );

                kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);

                break;

            case SDL_QUIT:

                printf("Stop !\n");

                quit = ;

                break;

        }

          }

    }

    endSDL();

}

接下来是SDL_WaitEvent的原型

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

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

void WaitKeyboard(SubWin sw){

    int quit = ;

    SDL_Event event;

    KEYBOARDMODE kmode = COMMAND;

    while(quit!=){

        //        printf ( "waiting for keyboard action\n" );

        //        while( SDL_PollEvent(&event)){

        SDL_WaitEvent(&event);

        printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );

        switch (event.type){

            case SDL_KEYDOWN:

                printf ( "tracking keydown\n" );

                kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);

                break;

            case SDL_QUIT:

                printf("stop !\n");

                quit = ;

                break;

        }

    }

    endSDL();

}

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. ORACLE数据库的导入及导出

    今天在客户这里导入oracle数据库,第一次导入oracle数据库,在这里记录一下,以后备用. 一.使用PLSQL导出导入ORACLE数据库: 1.打开plsql-->工具---->导出用 ...

  2. Ubuntu 更新源失败[GPG error]

    对于错误 GPG error: http://ppa.launchpad.net precise Release: The following signatures couldn't be verif ...

  3. 修复Grub引导

    1.运行终端,输入命令: sudo fdisk -l 找到linux所在的盘符,例如/dev/sdaX 2.获取root权限 3.mount mount –bind /proc /mnt/proc m ...

  4. Linux 使用iftop命令查看服务器流量

    简介 iftop是类似于linux下面top的实时流量监控工具. iftop可以用来监控网卡的实时流量(可以指定网段).反向解析IP.显示端口信息等,详细的将会在后面的使用参数中说明. 安装 # yu ...

  5. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  6. java设计模式之备忘录模式

    备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...

  7. JavaScript 基础回顾——函数

    在JavaScript中,函数也是一种数据类型,属于 function 类型,所以使用Function关键字标识函数名.函数可以在大括号内编写代码并且被调用,作为其他函数的参数或者对象的属性值. 1. ...

  8. NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  9. 项目<<魔兽登录系统>>

    创建魔兽系统相关窗体: 登录窗体(frmLogin) 注册窗体(frmRegister) 主窗体   (frmMain) 实现魔兽登录系统: 登录的界面如下 实现思路: 1.创建一个对象数组,长度为1 ...

  10. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 角色权限的配置页面改进优化

    往往开发的人不是维护的人,开发的单位不是维护的单位.信息的畅通沟通交流很多时候会有打折.扭曲.甚至是容易得到歪解.配置错业务操作权限.为了防止发生没必要的麻烦,甚至是发生重大错误,我们的软件需要不断换 ...