当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 > 第4章 Windows应用程序中的键盘与鼠标 > 4-4 例题4-4 > 4-4
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表
下面我们再讲一个应用程序的编写
这个程序是要求 打开这个应用程序后
按下鼠标的左键 在窗口中移动
大家现在看 比如说鼠标现在移动到这个位置
按下鼠标左键 这个时候
这个点 光标变成了十字形
按下鼠标左键 在窗口中移动
将按下左键时所在点和当前移动所形成的矩形
涂成灰色
大家看到的 随着我移动
移动区域变成了灰色
刚按下点的时候 光标为十字形
当抬起鼠标左键的时候
将前面所绘制的矩形拉伸到整个窗口
大家看这个窗口 整个变成灰色
拉伸过程中 光标设置为沙漏光标
然后 若双击鼠标左键
则灰色消失 窗口恢复到初始状态
大家再看一下
光标停在这个地方 这个时候光标为十字形
拉的过程中 光标变成沙漏光标 就是等待光标
然后停掉 鼠标抬起
就变成了整个区域的灰色
这个时候 鼠标在界面的任何位置双击
他又恢复到初始状态
这个例子就是这么个功能
下面我们来讲解这个例题的编写
我们还是只讲窗口消息处理函数
其他的和前面的类似
完整的源代码我们在我们的教学网站上已经上载
大家可以下载去学习
我们在这个应用程序里面
设置了这么一些参数
一个是operate
那么就是操作
一个是ready
是可以记录操作状态
那么ready和operate
一个是准备一个是操作
所以呢肯定是互斥的
刚开始的状态一定是ready状态
然后我们定义一个坐标BeginP和EndP
请大家注意这BeginP和EndP都是Point数据类型
说明呢这个BeginP里面包含了Point的x和y
EndP也是包含了Point的数据结构里面的x和y成员
那么BeginP就是我们鼠标刚才点下去的时候
看到的那个点
这个BeginP的话实际上就是
比如我的鼠标在这个位置点下去
那么这个点就是BeginP拉过来
这个终止点就是EndP
这个坐标
那么我们运行一下就知道了
然后这里定义了一个DC
这里由于我们要画图要用PAINTSTRUCT
然后画笔画刷
这个大家都知道了
那这个时候
大家知道我们在画窗口过程中
我们使用鼠标左键去点这个位置
所以得话,我们响应的是什么呢?
是鼠标左键
所以WM_LBUTTONDOWN
WM_LBUTTONDOWN如果这个operate非
就是不是在操作
跟ready两个相与是真
那么这时候呢operate呢给它激活
那么就是左键激活
开始捕获坐标消息
那么这个时候既然这个激活了
ready一定不是处于准备状态而是处于操作状态
所以这个就变成FALSE
然后开始捕捉鼠标
SetCapture那么就是在我们这个窗口中
激活对鼠标的捕捉
那么捕捉过程中
我们要载入这个光标
我们载入是IDC_CROSS
所以的话因为载入是IDC_CROSS
所以获得这个捕捉属性之后
我们一点下去就是十字光标
这就是捕捉到十字光标
那么十字光标捕捉完了
我们这里的位置是在哪呢?
马上获取BeginP的x坐标和BeginP的y坐标
那么就是鼠标位置的长字参数的低字节
和高字节
所以这样的话呢就是一点下去
马上就获取这个光标的位置
同时把这个光标设成十字光标
那么这样的话,我们就捕捉了这个信息
然后我们要做什么事情?
我们点下去之后
我们鼠标要移动
所以移动到终止点地方
我们才能知道它的点的坐标在哪
那么这时候
由于移动我们响应的是WM_MOUSEMOVE消息
那么如果是可以操作状态而不是ready状态的话呢
我们就要获得这个低字节
字参数低字节的是终止点的x坐标
和终止点y坐标
那么这时候我们要画一个矩形
矩形的话
我们有矩形的左边 右边 上边 下边
那么为什么要进行这么一个判断呢?
我们是要保证矩形的这个左上角
这个点是在左上角
而截止点在右下角
我们可以唯一的画一个矩形
然后对这个矩形进行刷新
那么为什么会这么做?
为什么会进行BeginP的x小于EndPx的判断
因为我们画图过程中可以这么画
可以这么画
可以这么画
并没有说必须是从上画到下
所以这样呢就出现BeginP这个初始点x
可能大于这个终止点的x
那么如果这种情况的话
就可能是从右边往左边画
那么这时候BeginP
x在这边
这个EndP
这个x显然就比BeginP的x要小
所以不见得就是
BeginP的x就是小于EndP的x
所以这样的话我这么画过来
BeginP的x一定是大于EndP的x
因为x坐标是向右的
那同理的话
也会出现BeginP.y和EndP.y的大小位置问题
好了所以要进行这么比较后
能保证这个矩形的上下左右的大小
然后,我们才可以画灰色的矩形
然后,由于我们载入光标的时候
就是滑动以后
MOUSEMOVE就是滑动以后我们显示的是等待光标
所以的话,就是大家看
我们到这滑动以后
这时候,光标是等待光标
所以,MOUSEMOVE过程中是等待光标
那么这里实际上我们加载的是等待光标
然后刷新
好了那么我们把这应用程序里面
比如说我们拉到这个地方后
鼠标左键要抬起来
那么我们还要响应鼠标左键抬起来的消息
好!抬起来后
是整个是变成灰色了
那么我们响应鼠标左键抬起来的消息operate
那么这时候呢我们仍然
加载的是等待光标
然后获取整个用户区
然后刷新整个用户区
这时候再把光标回到普通的箭头光标
那么大家看到我这个抬起来之后
光标变成普通的箭头光标
好了然后呢ReleaseCapture
那么把鼠标呢在当前捕捉状态的
在当前窗口的捕捉状态释放
那么实际上呢我们还有一个WM_PAINT消息
WM_PAINT消息是做什么
因为我这个画过程中放开的时候要变成灰色
所以这样的话我们就有一个填充的问题
填充就要用到WM_PAINT消息
WM_PAINT消息里面呢
我们在当前的设备环境进行填充
所以创建DC
然后我们填充的是灰色的画刷
然后将这个浅灰色画刷选入当前设备环境
然后我们画这个矩形
将这个矩形区域进行填充
矩形区域填充的大小是怎么来的呢?
就是从这里获取的填充区域大小
从这里获得的
而这里就是保证那个上下左右的坐标顺序
好了那么在这个填充区域
做完后我们把画刷就删除掉了
那么如果就是PAINT
如果这个ready是FALSE
那么说明什么呢?
说明它是在操作状态
如果是ready状态的话呢?
那么ready状态实际上我们大家看到了
它这个原来是白色的
所以的话,我们把整个用户区进行填充
这里还有一个问题
就是我们这个时候整个用户区
填充成灰色后我们要双击它后
它又变成白色了 复原了
那么这时候呢我们还要响应
鼠标双击的消息
鼠标双击的消息复原后要把
ready如果是FALSE就变成TRUE
初始状态
那么大家再回过头来看
初始状态这个ready是TRUE的
operate是FALSE
所以得话,我们回过头来
又给它变成初始状态
ready如果是FALSE一定变成TRUE
TRUE就可以又进入重新的操作
然后进行刷新
整个刷新的时候是对整个用户区进行刷新
刷新按系统标准的画刷刷新
所以原来系统刷是白色的
所以又复原成白色
那么这样的话我们就完成了
整个应用程序功能的编写
那么这个代码我们就介绍到这
-讨论实录
--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章源代码
--外部链接
-第一次作业
--第一次作业--作业
-第二次作业
--第二次作业--作业
-第三次作业
--第三次作业--作业