Win 32 应用程序生命周期
1. 程序进入点
Windows 程序进入点是 WinMain 函数
- 函数原型
int __clrcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd );
- 函数参数
-
hinstance 应用程序当前实例的句柄
-
hPrevlnstance 应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个 32 位程序,该参数总为 NULL。如打开了两个 QQ 后一个就是先前示例的窗口。
-
lpCmdLine 指向应用程序命令行的字符串的指针,不包括执行文件名。
-
nCmdShow 指明窗口如何显示,可以是以下的值等等
- SW_HIDE 隐藏窗口并且激活另外一个窗口。
- SW_MINIMIZE 最小化指定的窗口,并且激活在系统表中的顶层窗口。
- SW_SHOWNORMAL 激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置。
-
2. 创建窗口类
窗口类为窗口定义了窗口风格、窗口过程、显示和绘制窗口所需要的信息等。
3. 注册窗口类
通过 RegisterClass 函数来注册一下窗口类
4. 创建窗口
通过 CreateWindow 函数来创建窗口
5. 显示窗口
通过 ShowWindow 函数来显示窗口
6. 消息循环
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg); // 转换
DispatchMessage(&Msg); // 分发
}
7. 窗口处理函数
处理发送给窗口的消息
消息循环过程
捕获消息
Windows 一直监控着 I/O 设备,当用户通过鼠标,键盘来操作应用程序时,这个事件首先会被转化成消息,由 Windows 系统捕获,然后存放在系统消息队列中。
将消息发送到应用程序消息队列
Windows 系统知道该消息应由哪个应用程序处理,然后发送相应的应用程序消息队列,同时将该消息从自己的系统消息队列中删除。
应用程序获取消息
应用程序一直执行消息循环,在消息队列中发现了系统传过来的消息,之后获取消息。
应用程序处理消息
然后取出消息 (msg) 并将其传递给 TranslateMessage() 函数,这个函数可以将虚拟键值信息转换为字符信息。
窗口过程函数
将消息传递给 DispatchMessage() 函数。DispatchMessage() 函数将消息再给 Windows 系统,然后,Windows 将该消息发送给适当的窗口过程函数,即窗口的 WinPro 函数,处理完消息之后,WinPro 传回到 Windows。
处理完毕
应用程序的消息循环继续 while 循环,Windows 系统继续监控各类消息,重复上述步骤。
相关术语
-
系统
这里指的就是 Windows 操作系统 -
应用程序
比如 QQ PC 端,网易云音乐 PC 端,它们称为应用程序。 -
窗口
一个应用程序可以有多个窗口,比如 QQ 有主窗口,也有用于聊天的子窗口,但是一个窗口只能属于一个应用程序。 -
消息
Windows 消息,就是指 Windows 发出的一个通知,告诉应用程序某个事情发生了。例如,用户单击鼠标、改变窗口尺寸、按下键盘上的一个键,首先都会被 Windows 系统接收到,然后 Windows 发送这个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标,这样应用程序才会知道点击到了哪个位置。
因此 Windows 的消息提供了应用程序之间、应用程序与 Windows 系统之间进行通信的手段。
-
消息循环
Windows 系统的一种消息机制 -
消息队列
-
系统消息队列
这是一个系统唯一的队列,设备驱动会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程消息队列中等待处理。 -
线程消息队列
每一个 Windows 应用程序运行后,系统都会为该应用程序创建一个线程消息队列,这个消息队列用来存放该应用程序创建的窗口消息。用户对 Windows 进行操作后,产生消息,Windows 系统将产生的消息依次放入到线程消息队列中,而应用程序则通过一个消息循环不断地从线程消息队列中取出消息,并进行响应。
-
-
线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。