上一篇我们已经介绍了关于窗口程序的一些基本知识。从本篇开始我们将正式进入C win32的学习中去。
正文
窗口创建过程
-
定义WinMain函数
-
定义窗口处理函数(自定义,处理消息)
-
注册窗口类(向操作系统写入一些数据)
-
创建窗口(内存中创建窗口)
-
显示窗口(绘制窗口的图像)
-
消息循环(获取/翻译/派发消息)
-
消息处理
上一篇文章我们只是简单的了解了一下WinMain函数的写法。这次我们将深入的了解此函数
WinMain函数
在了解之前我们需要知道的是:什么是入口函数,它有什么作用?
入口函数:就是程序运行时候最开始调用的函数,具体来说,它指定编译器(或者其他类似工具)如何开始编译一个程序,因此用户现在可以在编译时运行一些预处理和初始化步骤。即使没有入口函数,一个项目也可以被编译器编译,但是没有入口函数,也不能使编译器进行任何必要的预处理和初始化步骤,并且编译后可能会有一些问题。
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd);
-
HINSTANCE hinstance, 表示应用程序当前的实例句柄,在windows程序中句柄无非就是一个数值
-
HINSTANCE hPrevInstance,表示应用程序上一个实例的句柄。
-
LPSTR lpCmdLine,指向应用程序命令行参数字符串的指针,不包括可执行文件名。
-
int nCmdShow,指定应用程序最初如何显示,例如在任务栏上正常显示、最大化到全屏显示或最小化显示。
在上面我们可以看到WinMain 前有一个WINAPI ,那么这个WINAPI 是什么意思呢,接下来就介绍一下。
WINAPI 头文件中的定义如下:
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#define APIENTRY WINAPI
可以看出上面定义的宏 都指向了 _stdcall ,那么无问题来了什么是_stdcall
- 是一种函数调用约定,也称为标准调用约定。
- 函数调用约定描述函数参数的传递方式和由谁来平衡堆栈
- 在程序中调用一个函数时,函数参数的传递是通过堆栈进行的,也就是说调用者把要传递给函数的参数压入堆栈,函数在执行过程中从堆栈中取出相应的参数使用。
结尾
在这里我们简单的介绍了什么是WinMain函数,之后的文章我们会依次介绍窗口创建过程的其他步骤。