当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 > 第4章 Windows应用程序中的键盘与鼠标 > 4-3 鼠标在应用程序中的应用 > 4-3
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表
在了解的键盘的使用之后
我们下面一起来了解下鼠标在应用程序中的应用
关于鼠标的应用 在应用程序中如何通过编程来体现
大家知道 鼠标作为定位输入设备
可以通过鼠标的单击 双击 或拖动功能
用户可以很容易的操作基于Windows图形界面的应用程序
Windows 通过光标来指示当前鼠标的位置
在Windows操作系统中 预定义了几种光标
比如说有箭头光标
十字光标
I型光标
以及十字箭头光标
或者是东南西北方向的光标
当然很多学员可能都玩过游戏
玩游戏的过程中发现 游戏里面的光标
是有些个性化的
特殊的 或者说是卡通形象的
实际上 那是用户自定义光标
用户自定义光标保存在一个扩展名为cur的文件中
所以用户自定义光标 只要这个前面放的是光标的名字
光标的关键字
然后把光标文件放这儿
那么这样就可以自定义自己的光标了
这一行代码仍然要在资源文件中编写
定义了一个自定义光标之后
只是定义了光标
实际上当真正使用的时候
还要加载光标
所以我们通过LoadCursor
在当前实例中加载当前的光标
当前光标就是自己定义的光标
比如说在WNDCLASS类的定义中
大家还经常用到这块
就是每次编程缺省的构架里面
都有一个光标加载问题
我们平常加载的都是标准光标
在这里我写了一行代码
就是在当前窗口下 这是当前实例句柄
说明指的是当前的窗口
在当前的窗口下加载的是IDC_WAIT光标
IDC_WAIT光标实际上是一个等待光标
等待光标在什么时候会出现呢
比如说大家再拷贝一个文件的过程中
这个拷贝动作没有完成 在这个过程中
反正是任何一个过程没有完成 处于等待状态的
通常这个时候将光标定义为 或者加载为 等待光标
通过光标给用户一个状态的标识
当然我们通过LoadCursor这个函数
改变光标的形式
这里IDC_WAIT就不是原来的IDC_ARROW标准的缺省光标了
那么我们谈到 光标它的位置
我们通常可以通过鼠标的移动来确定
这里面就牵涉到鼠标的消息
鼠标的消息里面同样包含lParam和wParam
lParam包含了鼠标当前的位置
wParam包含了各种虚拟键的状态
对于位置来说 它的地位就是x坐标
而高位就是y坐标
而对于虚拟键状态 比如说在按鼠标的时候
我们按的是鼠标的左键 右键 当中键
或者同时按下了Ctrl键,Shift键
这个是经常作为组合键来使用的
对于鼠标的消息 如果不监测Shift键或者Ctrl键
那么直接就是 case WM_LBUTTONDOWN
就是按下左键 或者 WM_LBUTTONUP
释放左键
让然如果L改成R就变成右键了
改成M就是中间键
如果要对Shift或者Ctrl进行监测的话
我们可以这么做
如果按下了左键 我们先确认按下左键
然后再看下是否按下了Ctrl键或者Shift键
那么判断Ctrl键我们用wParam&MK_CONTROL
或者wParam&MK_SHIFT
这里是AND关系
说明什么呢?
如果这个为真 它是同时按下了Ctrl和Shift
如果不是为真 也许两个键都没按
也许是按下了Ctrl或者Shift其中某一个键
因为这里是逻辑与的关系
所以要真的话 只有两个都按下才能为真
所以为真的情况是两个都按下
按下任何一个或者不按 都不会为真
这个逻辑运算 大家很清楚
注意这里用的是MK_CONTROL和MK_SHIFT
我们再回到这一张页面
这里面就是 虚拟键状态
如果Ctrl是MK_CONTROL
Shift是MK_SHIFT
至于 MK_LBUTTON MK_MBUTTON MK_RBUTTON
等同于 WM_LBUTTONDOWN WM_MBUTTONDOWN WM_RBUTTONDOWN
鼠标在操作过程中实际上有单击和双击之分
Windows系统默认的时间间隔为0.5s
也可以调用SetDoubleClickTime()重新设定间隔时间
要是窗口函数能接受鼠标双击产生的消息
必须在窗口注册类的时候要有CS_DBCLKS属性
如果没有CS_DBCLKS属性
单击两次鼠标 时间间隔再短 手再快
也是两次单击
因为它没有双击属性的识别
所以CS_DBCLKS属性的属性是在style样式里面定义的
所以大家可以复习一下wndclass类的构架里面
我们定义了一些参数
参数里面我们来识别一下
定义了这个参数 是鼠标的双击
如果窗口没有上述属性的定义
及时进行了双击
窗口也只能收到两条单击的消息
菜单、滚动条、工具条和标题条等处
这些用户区以外产生的鼠标时间
它会产生一个非用户区的鼠标消息
这个非用户区鼠标消息
并不是有应用程序处理
而是送到DefWindowProc这个函数来处理
这个时候大家可以回忆一下
我们讲的应用程序构架里面
总有一个DefWindowProc函数
由于鼠标移动的随机性
因为鼠标拿在手上的时候 会滑来滑去
实际上要点什么对象 目标很明确
但是走的轨迹 每个人都是不一样的
所以目标明确的情况下 走的过程是随机的
随意也就是说鼠标移动的随机性
如果要使某一个窗口能不间断地捕获鼠标消息
就必须对鼠标加以捕获
我们可以通过SetCaputre()这个函数来捕获
一旦从窗口捕获的鼠标
系统的键盘功能就暂时失效
其它窗口也无法得到鼠标消息
SetCapture()的参数是这个地方
就是在当前窗口的句柄给的这个SetCapture()函数
使得当前窗口获得捕获鼠标消息的权限
当该窗口不需要捕获鼠标消息的时候
就可以用ReleaseCapture()来释放鼠标
否则 其它窗口
由于已经设置了这个窗口获得鼠标消息的情况下
其它窗口都失去了获得鼠标消息的权限
实际上都无法接收鼠标消息
-讨论实录
--0-0
-1-1 Windows应用程序的特点
--1-1
-1-2 可视化编程
--1-2
-1-3 关于API
--1-3-1
--1-3-2
-1-4 Windows应用程序组成及编程步骤
--1-4-1
--1-4-2
-1-5 应用程序举例
--1-5-1
--1-5-2
--1-5-3
-02-1 Windows图形设备接口
-02-2 绘图工具与颜色
-02-3 常用绘图函数
-02-4 例题和作业
-第2章源代码
--外部链接
--外部链接
-3-1 设置文本的设备环境
-3-2 文本的输出过程
-3-3 例题和作业
-第3章源代码
--外部链接
-4-1 Windows 应用程序中的键盘与鼠标
--4-1
-4-2 键盘的操作应用举例
--4-2
-4-3 例题
--4-3
-4-3 鼠标在应用程序中的应用
--4-3
-4-4 例题4-4
--4-4
-第4章源代码
--外部链接
-5-1 菜单和加速键资源及其应用
--5-1
-5-1(例1)
--5-1(例1)
-5-2 位图资源及其应用
--5-2
-5-3 对话框资源及其应用
--5-3-1
--5-3-2
-5-4 图标资源的应用
--5-4
-第5章源代码
--外部链接
-第一次作业
--第一次作业--作业
-第二次作业
--第二次作业--作业
-第三次作业
--第三次作业--作业