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

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

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

3-3-2 (例3-2)

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

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

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

下面,我们再举一个例子

跟大家一块儿来熟悉一下文本与字体的操作

这个程序是要求通过在窗口中分五行分别显示文本

那么实际上这个例子是为了说明

在窗口的用户区中输出文本的方法常用的都有哪一些

那么大家可以看到,这里面分了五行

第一行是红色的

这是一行红色的,字体为SYSTEM_FONT的文字

第二行实际上是绿色的

现在显示的是自定义的绿色字体

第三行是蓝色的粗体字

第四行,是大号的斜体字

第五行大家能看出来,下划线这个地方有一个中断

什么原因造成的?

我们一块儿待会儿来分析

总之这里的五行字体、颜色、大小

或者说做的下划线的样式等等

这五行字样式都是不一样的

那么我们如何来完成这个工作呢?

那么下面我就跟大家通过代码的解释来了解

我们主要介绍WndProc

在这里面,我们定义了两种字体

一个是hF_black,还有一个是hF_big

当然了我们还得定义一个DC以及PAINTSTRUCT构架

因为字体牵扯到画图的问题所以都有PAINTSTRUCT

以及TEXTMETRIC构架的tm变量

那么用来记录字体的信息

跟前面一个例题不一样的是什么呢?

前面是一个指针数组

我这个地方是直接定义了6个字符串

那么大家如果愿意改成指针数组

像第一个例子的样式,也是没有问题的

刚才的程序运行的时候界面上是五行

而这里,我实际上定义了6行

也就是说我实际上是把第6个字符串

输出的时候接到了第五个字符串的后面

所以大家看的是五行

实际上我定义的是6个字符串

这个X、Y=0

就是起始的时候第一行的输出坐标位置是(0,0)

那么我们还定义了一个size变量

它是SIZE数据结构类型的

用来定义它的字符输出的位置

我们通过PAINT消息 我们来了解一下

首先我们要创建一个DC

因为第一行是红色

所以的话我先设置SetTextColor是红色

由于我们要求的是系统的SYSTEM_FONT字体

第一行是SYSTEM_FONT字体

所以的话我们是获取了缺省的字体GetTextMetrics

然后,在X、Y的位置

X、Y 因为我们输出的是第一行

X、Y的位置实际上就是(0,0)的位置

然后,把第一个字符串根据它字符串的长度、大小输出

那么这样的话,实际上我们到这个地方

已经输出了红色的、系统缺省的字符串

那么从X、Y位置(0,0)开始输出

那么输出之后,我们就要输出下一行的位置

这时候,这个X、Y请大家注意

输出的时候X、Y的值是没有变的

并不是说我输出一个字符之后

它的X值自动往右推出一个字符的宽度

它这个X、Y实际上只是定义了起始的坐标

所以在整个一行的文本输出过程中

X、Y的值都没有变

它定义的是输出的起始坐标

所以这个时候,我们为了要输出下一行

应该是在原来坐标基础上加上它的字符的高度

再加上字符的间隔

我这里定义了是100倍的间隔输出

那么大家再回过头看一下

大家看的是100,实际上它输出的间隔并不是想象的那么大

这是自定义字体了,高度是20,这是粗体字

这个斜体是0,下划线是0,删除线也是0

那么也就是说没有倾斜、没有下划线、没有删除线

用的字符集,用的CHARSET

字体的名称叫做粗体字

大家看到,字体的颜色是绿色

所以RGB这个地方绿色取255最大值

其他都取0的情况下 就是绿色

同样把这个粗体字的字体选入当前的设备环境句柄

然后获取字体的信息GetTextMetrics

把这个信息写到这个tm结构中

然后在X、Y的位置请大家注意

这个Y的值已经是新的值了

已经通过这个计算推算出下一行的起始位置的Y坐标了

不是原来的(0,0)了

那么这个时候我们输出第二个字符串

按第二个字符串的字节长度全部输出

我们要输出第三行

所以仍然要进行换行操作

所以的话这时候Y的值仍然要进行计算

计算完,我们要获取字符串的宽度

我们用GetTextExtentPoint去获取它的宽度

设置字体的颜色为蓝色

同样用TextOut进行第三个字符串的输出

我们仍然要计算下一行要输出的坐标的Y的值

要创建一个字体 叫做big字体

我们这时候字体高度取的30

是定义了斜体,输出时候是带下划线

那么这个字号就叫做大号字

其他的都用缺省值

定义好字体之后

我们仍然要把这个大号字选入当前的设备环境句柄

由于大家知道那个字是灰色的字 三个155都是灰色的

然后我们仍然要算出它的输出的位置

输出位置后,然后我们就TextOut第四个文本

然后大家看第五行又是红色的

我们又把颜色设回来,设置成红色的

从灰色又回到了红色

我们为了输出第五行

仍然要计算第五行的Y坐标

由于X还是0位置

都是从每一行的起始位置开始输出

所以0,X的值一直没有做计算

一直算的是换行的Y坐标

所以第五行TextOut输出

所以我们就获取了这个字符的宽度和起始坐标

由于是自定义字体

我们通过GetTextExtentPoint32,获取字符串的宽度

第六个字符串是接在第五个字符串后面

第六个字符串的Y坐标不要做计算,是X坐标做计算

由于我们通过这个GetTextExtentPoint32这里

已经获取了这个size,也就是说字符的宽度

那么这时候,在X的基础上加上这个宽度

是整个字符串的占的宽度

所以的话

在起始位置加上上一个字符串整个的宽度之后

这个值就是下一个字符串输出的起始位置

所以这时候Y的值没有变

那这个Y的值实际上就是输出第五行时Y的值

X的值,就是这个地方变化的X的值

输出第六个字符串

刚才那个第五行里面输出了两个字符串

两个字符串之间有一个间断

那个间断是怎么产生的?

那是因为我们在输出一个字符的时候

字符与字符之间是有间隔的

那么这个间隔的话,也被算到这里面去了

就是ize.cx里面去了

那么这样的话

输出的时候就多了一个间隔的值,那里就出现了中断

所以那个不连续的地方就是这么产生的

6个字符串输出之后,我们就EndPaint

EndPaint完了,然后把我们前面定义的句柄都删除掉

这样的话,我们这个程序的话,就基本结束了

下面是DESTROY跟default,跟前面完全一致

我们这个例子就介绍到这儿

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-2 (例3-2)笔记与讨论

也许你还感兴趣的课程:

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