当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 > 第2章 Windows的图形设备接口及Windows绘图 > 02-4 例题和作业 > 02-4-3 例题3
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表
下面
我们给大家一起编写一个应用程序
这个程序的功能是这样的
要求在屏幕上出现一个圆心沿正弦曲线轨迹
移动的实心圆
而且每隔四分之一周期
圆的填充色和圆的圆周颜色都发生变化
同时圆的半径在每四分之一周期之内
由正弦曲线幅值的0.2倍到0.6倍线性增长
大家看到这个题目要求应该能想出来
这是一个动画
我们先运行一下看看它的效果是什么样的
然后我们来介绍怎么达到这个效果
我们先看一下这个应用程序运行的效果是什么样的
这个时候大家在屏幕上看到了一个红色的sin曲线
在第一个四分之一周期中
圆和填充色是红色的
到了第二个四分之一周期
颜色就变成绿色的
那么大家看第三个四分之一周期就变成蓝色的
在圆的移动过程中
它的半径在不断地变化
实际上就是我们要求的从sin曲线幅值的0.2倍
到0.6倍线性的变化
那么这时候大家看的圆的移动过程中似乎有卡顿
实际上不是我们应用程序的卡顿
而是我故意在应用程序中设置了一个停留
否则的话
应用程序很快地执行过去
大家看不清效果
好了 那么在看到了应用程序运行的效果之后
我们来一起看一下这个应用程序
首先我们说正弦曲线是这个题目的基础
所以在WinMain函数消息循环之前
要生成正弦曲线各个点的坐标
我们把正弦曲线一个周期的横坐标
分成100个等分点
存储在数组lpSin这个数组中
那么100个点的坐标的计算是这样的
通过一个for循环
然后我们很容易地就把x坐标和y坐标算出来
x坐标实际上就是sin曲线全周期分成的100等份
那么这个算法我想大家很容易了解
我就不细说了
那么x,y
那么y的值实际上是根据x值的sin函数求出来的y的值
那么这个是它的幅值
就是sin曲线的幅值
动态显示圆在正弦曲线上的移动
我们把sin曲线的一个周期分成了100个点
所以数组lpSin的长度为100
那么这样设定圆在正弦曲线上移动时候共有100个位置
也就是说数组中的每一个值是
圆移动时圆心的坐标
每四分之一周期有25个位置
我们这么设
第一个四分之一周期 i<=25的时候
创建红色的画笔跟画刷
因为大家看到第一个四分之一周期的时候
圆以及它的填充色是红色的
那么画刷是用来填充的
画笔是画圆周的
第二个四分之一周期就是25到50
那么50是等于
25呢,因为前面25已经=了
这里就不能用=了
那么这时候用绿色的画笔跟画刷
依此类推
建蓝色跟黄色的画笔跟画刷
那么这时候在WM_PAINT这个消息处理中
调用BeginPaint函数获得设备环境句柄
所以在第一个四分之一周期里面
我们创建了CreatePen创建了一个画笔
画笔的话,这个颜色就是红色的
因为RGB颜色就是红色的
这个是笔的样式
所以大家看到
刚才这个圆不是一个实线的圆周
是一个点划线的圆周
然后我们再把画刷选入当前设备环境
同时随着圆心在sin曲线上的移动
每移动一个点
圆的半径就会从0.2到0.6线性增长
所以的话 我们就要算出
每一个点线性增长后它的圆的半径
那么这里每一个四分之一周期
都要有画笔、画刷和半径的计算
那大家看到了
实际上我每一个点的移动过程貌似有卡顿
实际上是不是卡顿的
是为了停留一定的时间
让大家看得清楚
所以的话, 我们每一步长停留0.1秒
所以用函数Sleep(100)
大家看了每一个步长之间是有停留的
是为了把它看清楚
所以这样的话
当然我们i是从0到99不是分了100等份么
所以到了小于100的时候
都要刷新用户区
而且刷新过程中发送了PAINT消息
消息是发到哪里呢?
发到窗口句柄
这个空,代表的是刷新整个用户区
同时刷新之前要清除用户区的所有内容
如果刷新之前不把用户区的所有内容清除掉
那么就出现图形的覆盖
那么大家注意这个Sleep(100)
里面的参数是以毫秒为单位
所以100毫秒就是0.1秒
下面,我们就进入应用程序
那么我们调出应用程序
有了刚才的知识铺垫
我们讲应用程序就比较简单了
那么在这里面, 我们经常要用到Pi
所以定义了宏定义了一个Pi
这个3.1415926
那这里面
由于WinMain跟前面是一样的
就用省略号就不细讲了
在WinMain里面
我们生成了正弦曲线的点坐标
那么生成点坐标刚才也给大家介绍了
就是100个点
然后我们进入消息循环
所以重点我们介绍WndProc
在这里面,我们创建了一个DC
一个画刷 画笔
以及定义了包含绘图信息的结构体变量
那么我们进入WM_PAINT之后
我们创建了一个DC
然后设置了原点坐标
同时我们创建了画笔
并把画笔选入当前的DC
画了一条正弦曲线
曲线画完后
我们就要处理每四分之一周期的情况
那么刚才介绍了
第一个四分之一周期
第二个四分之一周期
依此类推
它的笔的颜色不一样
大家重点看这个笔的颜色不一样
然后画刷用的是不一样的
那么这个画刷跟这个画刷
这四个画刷都不一样
大家在程序运行过程中如果留意看的话
就会发现每四分之一周期
圆的填充的背景是不一样的
虽然填充的颜色是一样的
但是填充的图案是不一样的
那么它的半径
圆的半径
那么每四分之一周期
这里有4个四分之一周期
它的增长率
它的算法
是一样的
在定义了每四分之一周期的画笔画刷之后
根据我们运行的消息传递
要将它的画刷跟画笔选入当前的设备环境
同时算出当前圆心所在的正弦曲线位置上的坐标
然后进行画圆
这里虽然用的是椭圆函数
但是椭圆函数的长短轴一样的时候
就变成圆
所以就画圆
然后每画一个
每一个步长i++
加的过程中
根据i的值判断来进入哪一个四分之一周期
从而决定选用什么笔和什么画刷
那么都结束后, 就把画笔跟画刷删除
那么每一个步长后
都停留了100毫秒
就是0.1秒
那在100以内
i<100以内
就是我们分了100个点之内
每一个步长都进行用户区的刷新
所以大家看到的那个圆,总是一个圆
如果没有背景刷新的话
不是整个用户区刷新的话
大家会看到一系列圆的轨迹全留在上面
这个有兴趣的同学
自己可以试一下
这个问题实际上处理起来并不那么困难
所以关键代码都给大家做了介绍
大家同样可以从我们教学网站上下载这个例题的代码
自己去分析一下
因为我们例题里面代码里面注释写得非常详细
大家很容易看懂
好!这个例题就讲到这儿
-讨论实录
--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章源代码
--外部链接
-第一次作业
--第一次作业--作业
-第二次作业
--第二次作业--作业
-第三次作业
--第三次作业--作业