当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 > 第1章 Windows应用程序基础 > 1-4 Windows应用程序组成及编程步骤 > 1-4-1
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表
现在我们要讲本讲的核心内容
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什么是系统回调
大家可能不熟悉
那么因为毕竟是第一节课
会接触到很多新的知识
这些新的知识可能是在后续逐步地明确的
因为也不可能通过一节课把后面所有内容都讲了
所以刚开始你们直接写上 后面慢慢再体会就可以了
-讨论实录
--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章源代码
--外部链接
-第一次作业
--第一次作业--作业
-第二次作业
--第二次作业--作业
-第三次作业
--第三次作业--作业