当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 > 第3章 文本与字体 > 3-3 例题和作业 > 3-3-3 (例3-3)
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表
下面我们再通过一个例子来介绍一下字符的使用
我们这个例子要求是这样的
在窗口中显示26个英文字母
从左到右字母依次位置提高10个像素单位
并且提高10个像素单位的那个字符颜色变为红色
然后又回到正常位置
当到达最右端后改变方向
从右向左依次又变成红色
并且提高10个像素单位
在窗口中的第二行显示26个字母
字体从正常到斜体
颜色从黑色到天蓝色不断交替变换
好,我们运行一下这个程序
大家看到红色的字符
从左到右然后从右到左
都是依次提高十个像素来显示
跳动显示
然后下面
a到z的字母
从正的到斜体
正常的是吧,到斜体
那么颜色从黑色到天蓝色交替变化
这个程序运行效果就是这样的
那么大家来看一下
这个例题应该怎么来完成
在运行过程中字符是a到z依次跳动
我们用nChar来标志跳起字母在26个字母的位置
那么这里比如说
我现在截的图
正好跳起来的字母是t
从左到右或者说从右到左
我们要有一个标识
我们用bRight
那也就是说这两个都是布尔值
我们定义它为真的情况下
就是从左向右那个字母依次跳高10个像素
那么这个例子我们要解决的一个核心问题
就是动态显示的问题
动态显示
我们在这里要创建一个定时器
那么也就是说每隔多长时间跳起一个字符
我们在CREATE消息处理中调用了SetTimer
创建了一个定时器
然后定时器会发出消息
对定时器消息进行WM_TIMER这个消息处理
那么在这个消息处理中
也就是要做定时的刷新用户区
刷新用户区后
它发送PAINT消息
来实现动态显示
这里有一个代码段
这个代码段就是按
黑色字体输出从字符串开头到当前位置的字符
比如说你现在输出的是
字符t是跳起来的
输出的时候把这个地方是看成一段输出
那么把这个地方看成一段输出
这个看做单字符输出
而这个单字符的位置
用nChar表示
a一直往这边移动的
移动到结束位置又返回移动
输出坐标我们定义一下
跳起的字符的话,是跳的10个字符
然后跳的字符的位置是nChar的位置
所以nChar前面的位置我们设置为黑色
然后我们输出这个字符的X坐标
然后输出前面的内容
这个前面的内容就是第0个到第nChar-1个字符的位置
我们通过一个循环输出
跳起来的字符我们是设成红色
那么跳起来位置的X值是要计算的
因为就是说
你从起始位置开始
经过了多少个字符
经过了nChar个字符后
你这个X的值移过了多少
然后在这个X坐标的基础上
你要计算Y这个坐标提高10个像素
那么这个时候,大家看我这个地方为什么加了10
而这个地方Y坐标反而没有加10
不是跳起来10个字符位置么
这是因为在屏幕里面
X坐标向右
Y坐标向下
那么原点在这个地方
如果我们认为跳起来的10个字符的位置
是标准位置的话
那么没跳起来的位置应该是靠下的
所以这个地方加了10
所以这个地方大家要注意一下
然后我们创建一个字体
选入设备环境
把第nChar个字符给它显示出来
关键是要计算X、Y的Y的坐标
那么算出来之后
由于我们要显示跳起来的字符后续的字符
后续的字符
所以我们计算Y坐标的时候又给它加了10
实际上跟原来的坐标恢复成一样的
然后,就从nChar+1开始循环
把后续的文本输出来
每输出一个文本
每输出一个字符
都要算出这个字符的X坐标
对吧
因为会往后往回推的
这样的话
就把这个跳起来的字符跟没有跳起来的字符
分段输出来了
实际上我们还要考虑
就是说它这个跳起来的字符
是从左到右还是从右到左
但不论是从左到右还是从右到左
对于当前的字符来说
它输出的规律都是
当前位置算一个输出
当前位置之前算一个字符串的输出
当前位置算一个字符串的输出
那么也就是说它这个循环过程中
这个nChar这个坐标位置的值
是以一步长递增
或者是以一步长递减
这是循环方向的问题
那么这时候
如果nChar达到了字符串的长度
那么也就是说输出到了最后一个字符位置时
我们要进行反向处理
反向处理就是bRight就是不能再向右了
给它设成FALSE
bLeft给它设成TRUE
那么就是从右到左移动
如果nChar变成0了
那么应该说回到了第一个字符位置
那么这时候
我们不能再往左了
那么也就是说这时候bRight给它变为TRUE
bLeft给它变为FALSE
那么对于bRight跟bLeft如何影响nChar的值
那么也就是说如果bRight是TRUE的情况下
也就是说是向右为真的情况下
我们nChar是一直++
那么++过程中,总会加到某个时间段
它的(值)等于整个字符串的长度
这个bRight不就变成FALSE了么
nChar就开始--了
那么减到某一个程度它又会变成0
那么也就是到了最左边的位置
这时候我们又要换个方向
这时候我们又变成bRight=TRUE
bLeft又变成FALSE
这样的话,交替地出现
就使得大家能够看到
刚才程序里运行结果是从左到右
又自动地从右到左来回移动
直到程序能够干预它停止
那么对于输出第二行字符
我们在PAINT里面处理
我们创建了一个斜体、大小为40的字体
放到DC里面去
然后把这个创建了新的字体句柄
选入当前的设备环境
计算出它的这个X、Y的值
那么大家说这个为什么乘2
你可以乘2
可以乘3
那么这个只是一个例题
如果这个bItalic斜体为真的情况下
我们变成黑色
否则
不是真的情况下
我们就变成天蓝色
那么这时候大家就看到我们程序运行过程中
一会儿黑色
一会儿天蓝色
仍然就是输出我们指定的字符串内容
那么也就是说为什么程序会按颜色变化
因为我们就是如果bItalic为TRUE的情况下
就给它变为FALSE
否则就变成TRUE
所以实际上就是程序运行过程中
是一直在交替变化的
所以当这个bItalic为真的时候
输出斜体天蓝色字符
为假时
输出正常的黑色字体
然后, 每执行一个周期后
对bItalic进行取反
在下一次显示过程中就会有不同的效果
就是正的和斜的
因为这个例子比较复杂
所以把思路先给大家做个详细的介绍
下面,我们打开编译环境
把这个例子的完整的代码的关键部分
再给大家看一下
前面,大家都很熟悉了
就是这个WndProc的函数原型
这里面定义了一个CreateFont函数
这CreateFont函数
然后我们定义了窗口的句柄
那么nChar刚开始为0
那么这样的话,就是说刚开始上面第一行是从左到右
然后定义了什么呢?
bRight为TRUE
bLeft为FALSE
bItalic为FALSE
那么就是说我们跳起的字符刚开始是从左到右
因为bRight为TRUE
因为这里为0
那么也只能是从左到右
不能再往左
所以这里bLeft肯定是FALSE
那么对于第二行显示的时候
bItalic是FALSE
所以刚开始的时候
第二行是正的黑体
那么WinMain里面跟前面一样
咱就不细说了
我们说WndProc
WndProc里面仍然一样
定义了设备环境句柄
定义了字体的句柄
以及包括绘图消息的ps
跟文本信息的结构tm
那么在这里面
就是a到z的字符串
就是我们定义要输出的字符串
然后这里定义了获取了a到z字符串的长度
刚开始的值
X、Y输出坐标起始位置是0
然后我们刚才说了
通过定时器发出消息
然后到PAINT里面
获取设备环境DC
通过CreateFont创建了一个字体
然后把这字体选入DC
那么这里面的计算代码已经都给大家介绍过了
我就不细讲了
那么这里面给大家说一下
有个定时器的消息
定时器的消息发出来的时候是发出刷新请求
是刷新用户区
刷新用户区的时候
我们就到PAINT里面去刷新
所以就走到PAINT里面来了
所以,这是通过定时器发送消息
发给谁呢?
发给了这个TIMER消息
TIMER消息发出刷新请求
这个刷新请求
PAINT去响应它
然后就进行文字的显示
那么它们是这么一个构架来完成
那么这里是InitWindows
大家都很熟悉了
关键是这里多了一个CreateFont
因为大家看前面函数原型原来都只有WndProc
InitWindowsClass跟InitWindows
这里面多了一个CreateFont
实际上我们自定义了一个创建字体的函数CreateFont
我们看一下CreateFont
CreateFont里面实际上我们是调用了这个CreateFont
我们返回了这个字体
这个句柄
这个句柄这里面实际上把这里的所有数据都进行了设置
表现上看来我们这里面只有这几个参数
实际上它真正的定义在这个地方
也就是说
其他的数据我们用的是缺省值
所以我们如果单独创建一个这个CreateFont
那么我们直接用标准的CreateFont函数的话
用系统定义的自定义的自带的这个CreateFont函数
也是可以的
这样我们只是做了一个简单化处理
好了
那么基本的构架都给大家介绍清楚了
大家如果有兴趣的话
可以从我们的教学网站上
把这个代码下载下来
自己在全面地体会
最好的体会办法是什么呢?
是把某一些参数去修改
比如说这个字符输出的间距
2改成5
改成15
改成20
体会一下它的间距变化是什么样的
再比如说
如果我们把bRight==TRUE
这时候情况下nChar++
你给人家变成减减
看看程序能不能正常运行
我们这样就知道代码的作用是什么
再比如说大家可以测试一下
把这个SetTimer去掉
不发送定时器消息
那么会变成什么样?
如果不发送定时器消息的话
或者说发送了定时器消息
没有让它去响应这个定时器消息
发出刷新请求的情况下
那么程序又会变成什么样?
我想大家通过这么一种学习体会
才能够真正认识事件驱动、消息响应的机制
-讨论实录
--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章源代码
--外部链接
-第一次作业
--第一次作业--作业
-第二次作业
--第二次作业--作业
-第三次作业
--第三次作业--作业