当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 >  第3章 文本与字体 >  3-3 例题和作业 >  3-3-3 (例3-3)

返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表

3-3-3 (例3-3)在线视频

3-3-3 (例3-3)

下一节:3-3-4 (例3-4)

返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表

3-3-3 (例3-3)课程教案、知识点、字幕

下面我们再通过一个例子来介绍一下字符的使用

我们这个例子要求是这样的

在窗口中显示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去掉

不发送定时器消息

那么会变成什么样?

如果不发送定时器消息的话

或者说发送了定时器消息

没有让它去响应这个定时器消息

发出刷新请求的情况下

那么程序又会变成什么样?

我想大家通过这么一种学习体会

才能够真正认识事件驱动、消息响应的机制

VC++面向对象与可视化程序设计(上):Windows编程基础课程列表:

第0章 课前讨论

-讨论实录

--0-0

第1章 Windows应用程序基础

-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

第2章 Windows的图形设备接口及Windows绘图

-02-1 Windows图形设备接口

--02-1-1 GDI

--02-1-2 图形刷新

--02-1-3 获得设备环境方法

--02-1-4 映像模式

-02-2 绘图工具与颜色

--02-2-1 画笔

--02-2-2 画刷和颜色

-02-3 常用绘图函数

--02-3 常用绘图函数

-02-4 例题和作业

--02-4-1 例题1

--02-4-2 例题2

--02-4-3 例题3

--02-4-4 例题4

--02-4-5 作业

-第2章源代码

--外部链接

--外部链接

第3章 文本与字体

-3-1 设置文本的设备环境

--3-1 设置文本的设备环境

-3-2 文本的输出过程

--3-2 文本的输出过程

-3-3 例题和作业

--3-3-1 (例3-1)

--3-3-2 (例3-2)

--3-3-3 (例3-3)

--3-3-4 (例3-4)

--3-3-5 (作业)

-第3章源代码

--外部链接

第4章 Windows应用程序中的键盘与鼠标

-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章 资源在Windows编程中的应用

-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章源代码

--外部链接

-第一次作业

--第一次作业--作业

-第二次作业

--第二次作业--作业

-第三次作业

--第三次作业--作业

3-3-3 (例3-3)笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。