c++鼠标操作详解

鼠标作为一种定位输入设备在Windows中得到了广泛的应用,通过鼠标的单击、双击功能和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。Windows中通过光标来指示当前鼠标的位置,在Windows操作系统中预定义了几种光标,并在Windows.h头文件中加以定义,这些系统预定义的光标如表6-4所示。

用户也可以通过图形编辑器自定义光标形式,将其保存为扩展名为.cur的文件中,采用自定义光标时,需要在资源文件中定义光标资源,其形式为:

    光标名 CURSOR 光标文件(.cur)

然后应用程序通过调用LoadCursor加载光标资源,其形式为:

    LoadCursor(hThisInst,lpszCursorname)

其中,hThisInst为应用程序当前实例句柄,lpszCursouname为当前光标,应用程序加载光标资源常在定义窗口类时进行,例如,下面的语句为窗口类wndclass

 

WNDCLASS     wndclass;

wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);

 

此外,还可在应用程序中调用LoadCursor函数改变光标形式。

 

表6-4 系统预定义的光标

代表预定义光标的常量

光标属性描述

IDC_ARROW

箭头光标

IDC_CROSS

十字光标

IDC_IDEAM

I形文本光标

IDC_ICON

空图标

IDC_SIZE

右下有小方形的方形图标

IDC_SIZENESW

带有指向东北方和西南方箭头的光标

IDC_SIZENS

带有指向北方和南方箭头的光标

IDC_SIZENWSE

带有指向西北方和东南方箭头的光标

ISC_SIZEWE

带有指向东方和西方箭头的光标

IDC_UPARROW

垂直箭头光标

IDC_WAIT

计时光标(也称沙漏光标)

 

所谓鼠标的单击操作,实际上是指用户按下鼠标按钮并松开的这一全过程。此过程可以用来选择对象;所谓鼠标的双击操作,实际上是指用户在很短的时间内(根据不同计算机的设置不同而不同,操作系统的缺省时间为0.5秒)进行两次单击鼠标的操作,此动作可以激活所选项的缺省操作;所谓鼠标的拖动操作,实际上是指用户按下鼠标按钮并在不松开鼠标按钮的情况下移动鼠标,此动作一般可以用来选择菜单和移动有关内容。

Windows操作系统通过鼠标设备驱动程序接收鼠标输入。鼠标驱动程序在启动Windows时装入,Windows操作系统通过鼠标驱动程序能检测出鼠标是否存在。如果鼠标已经存在,则设备驱动程序将注意到Windows的任何鼠标事件。每当在窗口内有鼠标事件发生时,窗口就接收到一个鼠标事件(以消息的形式发送给应用程序的窗口)。注意,能接收鼠标事件的窗口并不一定要求是活动窗口或者是具有输入焦点的窗口。

当作应用程序的用户区内产生一个鼠标事件时,就将产生一个用户区鼠标消息。表6-5中列出了所有的用户区鼠标消息。

表6-5   用户区鼠标消息

消息

含义

WM_LBUTTONDOWN

用户区内按下鼠标左键

WM_LBUTTONUP

用户区内松开下鼠标左键

WM_LBUTTONDBLCLK

用户区内双击鼠标左键

WM_MBUTTONDOWN

用户区内按下鼠标中键

WM_MBUTTONUP

用户区内松开鼠标中键

WM_MBUTTONDBLCLK

用户区内双击鼠标中键

WM_RBUTTONDOWN

用户区内按下鼠标右键

WM_RBUTTONUP

用户区内松开鼠标右键

WM_RBUTTONDBLCLK

用户区内双击鼠标右键

WM_MOUSEMOVE

鼠标在用户区内移动

在鼠标消息中,参数lParam包含了鼠标位置,lParam字的低位包含了鼠标位置的x坐标值,lParam字的高位包含了鼠标位置的y坐标。lParam所表示的坐标是相当于窗口的左上角为原点的坐标值;参数wParam内包含了一个指示各种虚键状态的值。wParam参数是表6-6中所列值的组合。

 

表6-6 wParam的值

含义

MK_CONTROL

按下键按上的Ctrl键

MK_LBUTTON

按下了鼠标左键,等同与WM_LBUTTONDOWN

MK_MBUTTON

按下了鼠标中键,等同与WM_MBUTTONDOWN

MK_RBUTTON

按下了鼠标右键,等同与WM_RBUTTONDOWN

MK_SHIFT

按下键盘上的Shift键

 

通过用户区消息的lParam和wParam参数,程序员就可以确定鼠标的位置和鼠标键的状态。

对于鼠标消息的处理,一般又分为两种,一种是要对Shift和Ctrl键进行监测,另一种则不监测

(1)监测Shift键和Ctrl键的一般用如下代码

case WM_LBUTTONDOWN:   //按下鼠标左键

   if((wParam&MK_CONTROL)&&(wParam&MK_SHIFT))

    …                           //Shift和Ctrl键都被按下

   break;

case WM_LBUTTONUP:     //释放鼠标左键

   …

   break;

   …

 

(2)不监测Shift键和Ctrl键的一般用如下代码

case WM_LBUTTONDOWN:   //按下鼠标左键

   …                           

   break;

case WM_LBUTTONUP:     //释放鼠标左键

   …

   break;

   …

 

前面已经谈到,对于鼠标双击,一般设定的双击时间间隔为0.5秒,这是Windows系统默认的时间间隔,当然,应用程序也可以调用能够SetDoubleClickTime()函数来重新设定此值,此外,若要使窗口函数能接收鼠标双击产生的消息,则在注册窗口类时必须注明该窗口类具有CS_DBLCLKS属性,定义方式如下:

wndclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKS;

若窗口不包含上述属性的定义,那么及时进行了双击操作,该窗口也只能接收到两条WM_BUTTONDOWN消息或两条WN_BUTTONUP消息。

每当在一个窗口的用户区以外的地方(例如在窗口的菜单、滚动条、工具条和标题条等处)产生了一个鼠标事件,就将产生一个非用户区鼠标消息,对于非用户区鼠标消息,往往不由应用程序进行具体处理,而是送往函数DefWindowProc进行处理。

通常情况下,只有当鼠标光标位于某一窗口的用户区或非用户区时,该窗口的窗口函数才能接收到鼠标消息,但是由于鼠标移动的随机性,难以保证光标始终不离开某一个窗口,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获,从而使Windows发送的所有鼠标消息均定向到某一个窗口,而不管鼠标的光标处于何处。

调用SetCapture()函数即可实现对鼠标的捕捉,如SetCapture(hWnd);就可以向句柄为hWnd的窗口发送所有的鼠标消息,一旦从窗口捕获了鼠标,系统的键盘功能就暂时失效,其它窗口也无法得到鼠标消息,因此,当该窗口不再需要捕获所有的鼠标消息时,应及时调用ReleaseCapture()函数加以释放鼠标,以便其它窗口可以正常地接收鼠标信息。

  • 15
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值