五、消息处理机制
十四、winMain函数
14.1、函数原型:
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
14.2、函数名前面的w说明是宽字符,当然存在宽字符那就会有与之对应的窄字符版本,
14.3、窄字符版本下唯一不同的是第三个参数,没有W。
14.4、APIENTRY(一种调用约定):
14.4.1、#define APIENTRY WINAPI
14.4.2、#define WINAPI __stdcall
14.4.3、__stdcall:实际上是一种调用约定
14.4.4、调用约定:
14.4.4.1、在函数中将调用约定去掉也是可以正常的运行这个函数的,因为已经存在默认。
14.4.4.1、那么调用约定有什么作用呢:
14.4.4.1.1、首先我们进行函数参数传递的时候都是通过栈进行的参数的传递。
14.4.4.1.2、当函数结束的时候栈帧将会被清理(平栈)。
14.4.4.1.3、__stdcall:指的是调用方进行清理。
14.4.4.1.4、__cdecl:由被调用方进行清理。
14.4.4.1.5、__fastcall:指的是不通过栈进行参数的传递,而是通过寄存器来进行参数的传递。
14.4.4.1.6、在C编译中使用的都是__cdecl,而在win32中全部用的都是__stdcall。
14.5、HINSTANCE:和之前讲的HANDLE 是一样的,同样是来表示一个内核对象、但是这个我们称之为一个实例对象。
14.6、我们可以像操作HANDLE 一样来进行HINSTANCE 对进程进行操作。
14.7、实例对象:指的是一个进程,
14.8、第一个参数hInstance是当前实例的实例句柄。
14.9、第二个参数hPrevInstance是父进程的实例句柄。
14.10、为什么需要由外部传递当前的实例句柄呢?
14.10.1、其实我们写的程序之所以能成为一个进程:是因为有操作系统的存在。
14.10.2、其实呢,winMain是一个被动调用的程序,而本身是不能自己进行进程的创建的,必须要由操作系统来进行进程的创建。
14.10.3、既然是由操作系统来创建这个进程的,所以本身程序是不知道这个进程编号的。
14.10.4、所以只能由外部来告知程序,你当前进程的ID是多少。
14.11、lpCmdLine:程序命令行。
14.12、nCmdShow:首先winMain所代表的是一个窗口进程,这个参数是指定这个窗口是如何来进行显示的。
14.13、通过CreateWindowW函数创建了一个窗口,返回一个窗口对象,以后要对窗口进行操作都是对这个窗口对象进行。
十五、窗口过程:
15.1、在win32的子系统中进行了所有消息的响应。
15.2、当硬件有任何的改变(比如鼠标点击),都会存储在一个共享区,这个区会被win32子系统不停的进行扫描。
15.3、win32子系统会把这种改变翻译成消息。
15.4、这个翻译成消息的过程之所以不放在内核中来进行:是因为内核需要非常的精简的(越简单越好),这会占用内核太多的资源。
15.5、在win32子系统为每个应用程序建立消息队列。
15.6、win32子系统所派发下来的消息一定是本程序的消息。
15.7、
typedef struct tagMSG { HWND hwnd; //在进来的时候就交代了窗口。 UINT message; //消息数值化,数值类型。 WPARAM wParam; //只有一个message的话,有时候不能来进行判断,该消息想要做什么。 LPARAM lParam; //这两个是消息附加信息,而这两个附加值的意义由message来决定。所以三个值加在一起,将会告知该消息将会做什么。 DWORD time; //消息创建的时间。用来判断消息处理前后。 POINT pt; //当前消息创建时,鼠标所在屏幕的位置。 #ifdef _MAC DWORD lPrivate; #endif } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
15.7.1、WPARAM和LPARAM:就是UINT类型,传进来一般是指针数值。
15.7.2、有了这个结构体之后呢,程序会一直的去GetMessage。
15.7.3、所有的消息都存在当前软件的消息队列中,所有必须使用GetMessage函数进行消息的获取。
十六、消息
16.1、WM:表示的是Windows Message。
16.2、窗口消息:针对窗口来说的(比如窗口的移动),就是有关窗口的所有消息,创建窗口CreateWindow函数的调用也是。
16.3、命令消息。
16.4、控件通知消息:比如按钮。