当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 >  第1章 Windows应用程序基础 >  1-4 Windows应用程序组成及编程步骤 >  1-4-1

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

1-4-1在线视频

1-4-1

下一节:1-4-2

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

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

现在我们要讲本讲的核心内容

Windows应用程序组成及编程步骤

首先我们介绍应用程序的组成

一个完整的Windows应用程序

通常它是由五种类型的文件组成

一个是源程序

第二是头文件

还有是模块定义文件

以及资源描述文件

和项目文件 项目文件有时候也称为工程文件Project

Windows应用程序它主要或至少由两部分构成

一个是入口函数 另一个是窗口函数

入口函数就是WinMain

那么就像大家学习C语言的时候

大家都编写过main函数

但是并没有要求大家编写窗口函数

那是应用程序的构架不一样

这是构成Windows应用程序的基本框架

在这个框架里面 包含了各种数据类型、数据结构和相应的函数

入口函数是什么

它是所有应用程序的入口

刚才说了类似你们编写C程序的main函数

在这入口函数里面要做什么事情

我们在这入口函数里面要完成一系列的定义和初始化

同时产生消息循环

窗口函数是WndProc的函数

那么在这里面是完成的一些消息循环的响应

所以WinMain和WndProc是Windows应用程序的主体

那我们细化地先来介绍WinMain函数

WinMain函数它的功能包含了这几类

首先我们要注册窗口的类

然后建立窗口并执行必要的初始化

在完成这些操作后我们将进入消息循环

根据所接受的消息调用相应的处理过程

当然一个程序运行总是要结束的

所以我们在这里面会有一个WM 就是Window Message的QUIT这个消息

检索到这个消息的时候终止程序的运行

WinMain函数它的基本的组成部分主要有

函数的说明、初始化以及消息循环

我们首先介绍WinMain的三个基本组成部分的第一部分

WinMain函数的话它包含了四个参数 这是系统定义的

第一个是应用程序的当前的句柄

大家知道Windows应用程序是多任务的

也就是说在这个应用程序里面

我可以启动或者执行另外一个应用程序或者实例

那么你要运行另外一个应用程序或者实例

必须有一个句柄去指向你所要执行的其他应用程序或者实例

那既然你要执行其他应用程序

你就要有一个指向程序的命令的这个参数的指针

以及应用程序开始执行时窗口所显示的标识

在这里请大家注意

Windows它既然是多任务管理的

也就是说同一个应用程序的的多个窗口可能会同时存在

那么每一个窗口我们都称为一个实例的情况下

也就是说多个窗口每一个窗口都要有一个句柄指向一个窗口

这样的话我们才能够识别不同的窗口

也就是说用一个句柄唯一地指向一个窗口对象

所以我们操作不同的实例的时候

都是先把指向这个实例的句柄找到

通过句柄操作去指向这个对象

第二部分我们现在要讲的是Window函数基本功能中的

三个基本组成部分中的第二个 初始化

我们来介绍一下初始化都要对哪一些内容进行初始化

首先我们要进行窗口类的定义

这是定义窗口的形式与功能

也就是说在窗口里面要加载什么样的图标标识

要加载什么样的光标

以及要加载其他的GetStockObject

在这里面我们可能要加载画柄、画刷、背景等等等等

初始化里面还有个是窗口类的注册

窗口类必须是先注册然后才能使用

所以注册里面用的是RegisterClass

有了这两个内容之后我们才进行窗口的创建

我们调用的是CreateWindow

然后你创建完 它是在系统里面创建

在内存中产生 还没有显示到显示器上

所以这时候你要调用ShowWindow跟UpdateWindow

才能在显示器上显示你刚才创建的窗口

这就是我们第二个过程 初始化

那么初始化这里面刚才谈到的窗口类的定义

窗口类的注册、创建窗口实例以及显示

针对这些概念和过程我们进行详细的介绍

首先是窗口类的定义

窗口类的定义我们是给窗口类的数据结构叫WNDCLASS

这个数据结构大家也可以通过MSDN自己去全面了解一下

这个WNDCLASS到底有哪些参数

每一个参数它可选项是哪一些

每一个参数它的数据类型是什么

每一个参数它要完成的工作是什么

所以这个数据结构中包含了窗口类的各种属性

比如说在这里面LoadIcon

它的返回值的数据类型就是一个Icon的句柄

那这里面这些句柄的概念

大家在后面会接触很多

刚学的时候可能会觉得这里面不同的句柄到底是什么

你就理解为不同的数据类型

就像我们前面学习C语言的时候

大家也都有基础了 你学过整型、实型、字符型等等等等

你这时候你就想着它返回的是一个Icon的数据类型

返回的就是一个图标 就是图标数据类型

你这么理解就可以了 是吧

那么这里面就有两个参数

第一个参数就是说你在什么地方加载这个图标

所以这里面有一个当前的实例句柄

也就是说指向哪一个窗口

就是说在哪一个窗口里面加载你的图标

这是第一个参数

第二个参数 你加载图标加载的是什么图标

你可能电脑里面保留了很多图标文件

那么你选的是哪一个文件

所以这里面就有一个图标的标识的名字

也就是说在哪一个窗口里面加载了哪一个图标

就这两个参数

那么刚才讲的是图标加载的是Icon

这里面紧接着我们介绍的就是Cursor光标

我们现在在应用程序里面加载的是什么类型的光标

是十字叉的 还是双箭头的

左右双箭头 上下双箭头 或者是沙漏光标等等等等

那么你进入不同操作的时候

它就有不同类型的光标来告诉你

你现在的应用程序是处于什么样的状态

大家去体验一下Word文档就知道了

这里面同样两个参数

第一个参数就是光标在哪一个窗口

第二个参数就是我们用的是什么样的光标

刚才说了我们应用程序 通常背景都是白色的

那么这白色是怎么产生的

实际上我们调用了一个函数GetStockObject

这函数的返回值这时候大家看到的是HBRUSH

你这时候就体会它的返回值是一个刷子的数据类型

那这里面是什么

是刷子的颜色

你刷成红色用红色的代码

刷成白色用白色的值

那么这里面颜色的值是用RGB三原色来完成的

第二我们讲窗口注册类

Windows系统本身提供了部分的预定的窗口类

那么程序员也可以自定义窗口类

窗口类必须是先注册然后才能使用

它由RegisterClass这个函数来实现

那么这里面有个参数是wndclass的取地址

那wndclass取地址

wndclass是什么

就是窗口结构类 这个前面介绍过了

那么由WNDCLASS数据结构定义了一个wndclass的对象

取这个对象的地址

它的返回值是一个布尔值 true or false

如果返回值是true 说明注册成功 false就是注册失败

当它注册完成返回值为true

这个时候我们就可以来创建窗口的实例

大家知道窗口实例里面我们要进行这些内容的赋值

第一个是窗口类的名字

你要给它定义一个窗口类

第二个是窗口的标题名

这里的窗口标题名

这个窗口标题名是什么标题

大家比如说你在用Word文档的时候

你要保存一个文档

你可以选择保存菜单项

或者是另存为菜单项

当你选择另存为菜单项的时候

就会弹出一个“另存为”的对话框

对话框上面就有一个“另存为”这三个字

所以这个就是窗口的标题名

这里第三个参数是窗口的样式

这个窗口样式大家不要理解为就是常规的窗口

我在前面讲过按钮实际上也是一个窗口

滚动条也是一个窗口 诸如此类

所以这里面 窗口不同的样式确定了你这个窗口对象到底是个什么样的对象

窗口这个x、y就是左上角的坐标

通过左上角的坐标对这个窗口对象的起始位置进行定位

再配予下面的宽度和高度

就唯一确定了一个矩形对象的位置和大小

当然这个矩形对象是在一个窗口的下面

那么它就有一个父窗口

就像父亲跟孩子

它是多任务多窗口的操作系统

当多个窗口打开的时候

每一个窗口可能都有它的子窗口

那你建的这个对象是在哪一个窗口的子窗口下面

所以你就有当前的窗口

你这个窗口主菜单句柄就是说

你现在这个菜单是挂接在哪一个窗口上 你既然是多窗口

哪一个窗口就是hInstance 就是当前窗口

那么你如果多窗口的情况下真正运行的窗口只有一个窗口

其他窗口都是在后台的

那么你选中的那个窗口就是当前窗口

所以这个当前窗口根据你选中的窗口它是在不断变化的

这个参数是指向一个传递给窗口的参数值的指针

这个Window Style窗口样式

窗口样式里面这里比如说有带边框的窗口

带标题栏的、带滚动条的、带最大化最小化框的等等吧

那么你定义完窗口是要显示窗口的

窗口类的显示由ShowWindow和UpdateWindow函数来实现

那应用程序调用ShowWindow函数在屏幕中显示窗口

那显示窗口就有一个窗口显示形式的标识

标识比如说这是显示最小化、显示最大化

显示但并不激活

不激活情况下这个窗口现在是不能操作的

我们的Windows是多任务多窗口的应用程序

当你运行这个程序的时候

实际上当前激活的窗口只有一个

当你选中了哪个窗口就激活了哪个窗口

激活一个窗口其他窗口都变为不激活的

所以大家知道你一个时间只能操作一个窗口

关于显示窗口的一些参数的标识

这里我给出了MSDN的一个地址了

大家可以看一下这个网址的内容

显示窗口后

应用程序要调用UpdateWindow来更新用户区

这时候就发出PAINT消息

那么PAINT消息发出去后什么地方去接受这个PAINT消息

我们回头再说

调用了UpdateWindow

这里有一个窗口句柄

就是说更新的是哪一个窗口的用户区

因为你改动了这个用户区之后要显示出来

所以就要通过Update对这个句柄所指向的窗口对象进行更新

下面我们讲消息循环

什么叫消息循环

就是Window将产生的消息放到一个消息队列去

然后WinMain函数是将消息传递给窗口处理函数WndProc函数进行相应的处理

消息循环常见的格式是这样的

这里定义了一个MSG message的对象

那么这个MSG结构体在前面已经给大家介绍过了

那么这里有一部分代码……这里就不说了

大家编程过程中你根据你的需要去编写

它这里主要是有这么几句代码 这个是必须写的

while GetMessage 获得消息

然后将获得的消息

将消息的虚拟键转化为字符消息 TranslateMessage

然后再将消息传递到指定的窗口函数 DispatchMessage

主要大家在消息循环中大家要编写这几行代码

这个函数Get Message是怎么get message

大家看到这里面是第一个参数是指向message结构的指针

第二个参数是哪一个窗口

从哪一个窗口获取这个消息

第三个和第四个参数就是用于过滤这个消息过滤的最大的消息号和最小的消息号

也就是说消息有个编号 编号有个区间

用来过滤这个区间的 是否是合理的消息

它要完成的就是从消息队列中读取一条消息get message

然后给它放到这个message结构中

好了 刚才主要介绍的是WinMain的构架

下面我们再介绍WndProc的构架

WndProc是定义了应用程序对接收到的不同消息的响应

它包含了对各种可能接收到的消息的处理过程

它的构架里面非常简单

就是大家C语言里面学习过的switch-case构架

比如说WndProc WndProc的这个是消息处理函数

针对的哪一个窗口的消息

这里有个窗口的句柄

传过来的什么消息是message

以及消息的字参数和长字参数

好了 那么这个switch就看这个地方传过来的消息

放到这个message

然后对这个message进行判断 满足哪一个case

那么就对这个case里面就响应相应的message操作

可能是鼠标左键操作 可能是鼠标右键操作等等等等

这些都是属于消息 都是放到message里面

那么这里面有一个特殊的消息就是DESTROY

遇到这个DESTROY消息就是退出消息循环

还有一个是Default消息

缺省的DefWindowProc也是四个参数

跟这个WndProc的一样

为什么会有DefWindowProc

也就是说你这里如果定义了鼠标左键操作 鼠标右键操作 单击鼠标 双击鼠标

以及键盘的ABCDE操作

比如说你响应的这五个键盘消息

这时候用户操作出错

他按了一个K键

好了 那么这个K键肯定也是作为一个消息要传过来的

传过来你系统要怎么处理这个消息

大家知道switch-case构架里面都有一个Default 这个缺省操作

那么这时候缺省的操作的话

我们在学习C程序设计的时候

可能你会做的一个Default操作很简单就是break

就是不管它 不处理

但是在我们这个面向对象程序设计里面

它是这样的 它是用的DefWindowProc的

就是前面处理不了的操作 都在这里面操作

那这里面怎么操作、操作了什么 用户不要管它

你只要把这一行写上就行了

它实际上做的事情就是过滤掉前面那个case里面没有列出来的消息

它都给它过滤掉了 也是不处理

在消息处理程序当中

一般都有这个DESTROY这个消息

它 用来关闭窗口

这时候它在应用程序中实际上发出了一个QUIT消息 请求了退出

那么它的处理函数是PostQuitMessage

那么根据消息码来决定你是怎么个退出法

那么这个是WndProc构架

WndProc构架大家

程序C语言程序设计如果学得比较扎实的话

对于这个构架实际上是非常容易理解的

那这里面有两个数据类型 LRESULT和CALLBACK

LRESULT消息是一种消息处理结果的返回值的数据类型

它实际上就是一个长整的long

CALLBACK这个是表示这个函数是给系统调用的

有时候我们称为回调函数

所以 刚初学的过程中

可能对CALLBACK什么是系统回调

大家可能不熟悉

那么因为毕竟是第一节课

会接触到很多新的知识

这些新的知识可能是在后续逐步地明确的

因为也不可能通过一节课把后面所有内容都讲了

所以刚开始你们直接写上 后面慢慢再体会就可以了

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

--外部链接

-第一次作业

--第一次作业--作业

-第二次作业

--第二次作业--作业

-第三次作业

--第三次作业--作业

1-4-1笔记与讨论

也许你还感兴趣的课程:

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