当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 >  第2章 Windows的图形设备接口及Windows绘图 >  02-4 例题和作业 >  02-4-1 例题1

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

02-4-1 例题1在线视频

02-4-1 例题1

下一节:02-4-2 例题2

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

02-4-1 例题1课程教案、知识点、字幕

好,那下面我们先来通过第一个例子给大家介绍一下

画笔和画刷的应用

这个例子

第一个例子非常简单

我们大家来看一下

也就是说大家现在看到了这个程序的界面

就是我们要完成的应用程序的功能

在这里面,画了一个三角形

画了一个圆

画了一个多边形

然后,这边画了一个圆角矩形

这边实际上画的是椭圆扇形

这个是一个矩形

那么它都用黑色的画刷填充

那我们看一下这个程序怎么实现

那我们就进入Visual Studio

我们创建一个工程文件

这个名字根据我们例题的序号安排

我们起一个“2_1”

是我们第二讲的第一个例题

这个时候创建了一个空的工程文件

那这时候我们要编写我们的应用程序

所以在源程序这个地方,添加一个新建项

那么这个新建项,就是C++的源文件

所以这个源文件

我们也给它取成名字2_1

好了

这个时候,大家看到了一个空壳的应用程序

然后,为了加快我们应用程序的录入

我们直接把运行、调试通过了的这么一个源程序拷贝进去

这样节省大家的时间

好!我们现在就把应用程序完全拷贝过来了

那么我们一块儿来看一下这个应用程序的编写

我们先给它这一个个函数收进去

这三个

这个WndProc因为被调函数在主调函数后面出现

所以前面有一个函数原型的定义

那么WndProc,它的这几个参数

在第一讲里面都给大家做了介绍

这里不重复了

这两个是InitWindowsClass 窗口类的初始化

以及InitWindows 窗口的初始化

这同样也是函数原型的定义

因为被调的函数都在WinMain后面

这三个函数

这三个被调函数都是WinMain调用的

所以在WinMain的后面出现

所以要有这三个函数原型的定义

那么大家如果熟悉C语言的构架的话

你把这三个函数放到WinMain前面的话

这三行就可以不要了

好了!我们首先先展开WinMain函数

大家可以回忆一下我们前面讲到的应用程序构架的时候

说到Windows应用程序必须或者至少要有

WinMain跟WndProc这两个函数

那我们先看WinMain函数

WinMain函数由于我们这个画的图比较简单

所以在这里面WinMain里面只做了一个消息循环

前面做的是定义了消息的参数Message

以及对窗口进行初始化和窗口类进行初始化

所以这里是InitWindowsClass

InitWindowsClass在哪儿呢?

在这个地方

我们打开这个

因为在这个地方我们调用了InitWindowsClass

所以我们打开window的InitWindowsClass这个函数

在这个函数里面

定义了窗口的类

从定义的窗口类里面

大家看到了

在这个定义窗口背景的时候

就是用的WHITE_BRUSH

白色的画刷

于是大家看到的

于是大家看到的我们这个应用程序的背景是白色的

它的白色的原因就是在WndClass

InitWindowsClass这个窗口类的定义过程中

在背景刷的定义上

使用的系统定义的WHITE_BRUSH

那么这里,因为GetStockObject可以是把一个背景刷

选入设备环境

也可以是将一个笔选入设备环境

那么为了体现这个地方选的是背景刷

所以这里要有一个HBRUSH的强制类型转换

这一点请大家注意

否则的话,如果没有这个强制类型转换的话

系统可能不知道我获得的是笔还是刷

我们定义的是IDC_ARROW这个光标

这就是大家平常常见的、目前现在看到的

这个空心的光标

这个参数里面定义了消息处理的函数

在这个窗口类定义里面

它定义了消息类的处理函数是用WndProc

于是我们在前面这个地方才有WndProc这个函数

去处理窗口消息

WinMain函数里面这里进行着窗口类的初始化

或者说注册吧

然后紧接着进行窗口的初始化InitWindows

那好,大家一起来看一下 InitWindows

我们打开InitWindows

在窗口初始化过程中我们做什么呢?

首先既然要初始化一个窗口

如果没有创建一个窗口

也就是说窗口如果不存在的情况下

你就没有初始化窗口的可能性和必要性

所以,在这里面我们首先要创建一个窗口

既然要创建一个窗口

就要定义一个窗口的句柄

所以这里HWND定义了一个窗口的句柄

窗口句柄里面窗口类的名字叫做WinFill

那么这地方用的这个参数

要跟窗口类定义window

InitWindowsClass这个WinFill

就是窗口类的名字这个地方要对应起来

这个就是窗口类的名字WinFill跟初始化窗口里面

第一个参数要对应起来

那么这个填充程序示例

实际上就是窗口类里面的标识

这个标识在哪里呢?

就是这个地方大家看到的“填充示例程序”

这个字符串是在应用程序的提示栏标题栏里面提示了

然后这里面 这个参数是缺省的参数

这个OVERLAPPEDWINDOW大家平时就用这个参数

这是标准参数

当然也可以有窗口的其他得样式

我们编写普通的应用程序通常用这个参数

其他的参数都是用缺省值

这个,不细说了

那么创建了窗口之后

我们要把窗口显示在屏幕上

所以用的是ShowWindow

然后刷新UpdateWindow

所以这样的话,我们有了这几个步骤

就完成了窗口的初始化

当然这里面还有一个窗口初始化的判断

成功情况

如果创建的这个窗口“非”

取反是真

那么也就是说这个地方是假

假的情况是什么意思呢?

这个窗口没有创建成功

那么return FALSE 出错,对吧!

那么由于没有创建成功

就不存在着显示和刷新窗口的问题

所以就直接从这里就return FALSE

如果成功了

那么这里就return TRUE

当然是在显示窗口之后return TRUE

好了!在这里面我们刚才介绍了初始化窗口类

以及初始化窗口

那实际上这里面我们讲的只是WinMain里面

执行的这两行代码

下面要进入消息循环

而消息循环对于要产生的消息

从窗口类的注册里面大家已经看到了

它的对消息的处理使用的是WndProc函数

所以我们现在就回过来重点介绍WndProc函数做什么

那么当这个消息从主函数传过来之后

也传过来了消息的字参数和长字参数

关于字参数和长字参数

我们在第一讲里面曾经给大家非常详细地介绍了

这里面第一个参数就是说哪一个窗口传过来的消息

那么这四个参数就是哪一个窗口传过来的消息

传过来的是什么消息

这个消息的字参数和长字参数是哪一些

那么也就是说,把消息属性传过来之后

我们要开始消息的处理

既然是进行消息的处理

我们就要在设备环境里面处理消息

所以定义了HDC

设备环境句柄

当然由于我们做的是绘图的工作

而且根据我们题目的要求

有一个地方要刷成黑色的背景刷

所以这样的话

我们就要定义画刷句柄

当然画图肯定要用画笔句柄

以及指向包含绘图信息的结构变量

如果我们画的图它的背景就是白色的

跟Windows系统的背景是一样的

那么大家刚才从窗口初始化里面已经了解到

系统里面选择的画刷就是白画刷

那么这时候,你如果画的图形里面

它的背景就是白色的

那如果是这样 你可以不定义画刷句柄

你就缺省的只要把那图形画出来就行

那么它的背景就是白色的

所以就没必要去刷背景

就没必要去刷背景

如果背景不是白色的

那么你就要定义画刷的句柄

相应地去通过画刷去进行颜色填充

封闭的几何图形的每一个点的坐标

在这里面给大家都列在这儿了

那么这个时候大家看到这个点,就是

这个时候大家看到

比如画这个多边形的时候得有五个点

那我们回过头

我们这里,设的六个点

这时候大家注意到第一个点

跟最后一个点的坐标是一样的

必须一样

所以最后一个点也得给它算一个点

仍然要把坐标列出来

这个刚才已经给大家介绍过了

否则这个图形不闭合

好了!那我们处理的这个消息就是PAINT消息

PAINT消息,就是画图

那这样我们要创建DC

把这个绘图结构在这个window里面

将它的绘图结构的信息取出来

放到设备环境里面去

由于没开始画图之前

要先选一个空的笔

没画图之前一定要选一个空的笔

然后我们获得了这个笔的句柄后

将这个笔选入当前的设备环境

同样,我们选一个黑色的画刷

也选入当前的设备环境

然后开始画线

那么画线的话

我们回过头来看这个PPT

就从刚才的编辑环境里面回到这个PPT

是为了我们讲起来大家更容易理解

大家看我这里虽然编的是行号

行号请大家注意,我们编写应用程序是不需要行号的

我这个标识出来只是为了大家识别方便

好了!那这样的话, 大家看

我前面已经把画笔画刷选入当前的设备环境

然后就从50这个点开始画线

画完我们实际上大家看到前面这个线是一个

这个笔是一个空笔

那么空笔画线是一个什么意思呢?

实际上是把这个笔移到起始位置

因为是空笔,移的轨迹上是不留下笔的痕迹的

然后开始画三角形

这个三角形

这个三条线

大家看到这个三角形

是指向了我这个图形的这个位置

然后用Polyline的话

画的是这个多边形

这个Arc的话,画的是这个圆

这个Pie,画的是这个饼形

然后,这个画了这个矩形和圆角矩形

那么当我们画笔跟画刷都使用完之后

要删除画笔和画刷

同时的话

要用EndPaint来结束画图

因为我们前面用BeginPaint创建了DC hDC

那么画图结束的话, 要EndPaint

那么这是关闭应用程序了

这个DefWindowProc在我们第一讲里面曾经给大家介绍过了

这里不细说了

那我们给大家运行一下这个应用程序

首先要生成应用程序

编译一下运行程序

这时候大家看到了“成功1个 失败0个”

那么应用程序编译成功

我们执行一下

好!那么这个时候大家看到的

就是我们要完成的应用程序的情况

这时候大家看到我们所画的图

跟我们前面应用程序要求的这个界面

是完全一致的

应该说这个例子比较简单

我已经把我们这个应用程序的源代码放到了我们的教学网站上

大家可以下载去体会

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

--外部链接

-第一次作业

--第一次作业--作业

-第二次作业

--第二次作业--作业

-第三次作业

--第三次作业--作业

02-4-1 例题1笔记与讨论

也许你还感兴趣的课程:

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