Windows消息流程
很多人还是不很清楚Windows的消息机制,不明白什么时候发生什么事,怎么发生的,下面的消息,都是在CreateWindow函数里执行的,有人说不是GetMessage还没执行么怎么取得的消息,其实这里是CreateWindow直接调用窗口过程函数的,CreateWindow参数里不是有个Class么,注册的类,里面有个消息处理过程变量还记得么,就是WndProc,CreateWindow就是取这个函数地址来调用的,按下面消息顺序执行。
#define WM_GETMINMAXINFO 0x0024 hwnd(class=xx)
#define WM_NCCREATE 0x0081 hwnd(class=xx) 完毕后SPY++有窗口显示
#define WM_NCCALCSIZE 0x0083 hwnd(title) //当客户区窗口位置大小需要计算时发送
#define WM_CREATE 0x0001 hwnd(title) //仅仅窗口创建完毕了 又有人说这个窗口过程函数第一个参数不是hwnd么,这时候CreateWindow函数还没返回怎么会有hwnd呢,其实在调用这些消息前,CreateWindow内部已经取得了hwnd,然后供这些消息调用,在最后一个WM_CREATE返回后,把内部取得的hwnd返回供应用程序调用! 接着调用 ShowWindow(hWnd, nCmdShow); 这个函数用来显示窗口用,让我们能在桌面上看到窗口,这个函数也是直接调用窗口过程函数,并没有实际发送消息,具体消息流程如下:
#define WM_SHOWWINDOW 0x0018 //执行后窗口显示,但看不见位置不对
#define WM_WINDOWPOSCHANGING 0x0046 //当窗口大小,位置,Z序需要改变时发送
#define WM_ACTIVATEAPP 0x001C //应用程序激活,
#define WM_NCACTIVATE 0x0086 //将非客户区激活/非激活 (是否激活和wParam有关,如果激活则系统用默认激活背景画非客户区,否则非激活背景画,默认的WINDOWS的非激活是淡蓝色,激活是蓝色的)
#define WM_GETICON 0x007F //执行3次在非客户区显示图标标题和淡蓝色背景
#define WM_ACTIVATE 0x0006 //窗口准备激活/非激活
#define WM_SETFOCUS 0x0007 //窗口取得键盘焦点时发送
#define WM_NCPAINT 0x0085 //这时绘画窗口边框(非客户区)
#define WM_ERASEBKGND 0x0014 //用类中定义画刷刷客户区背景
#define WM_WINDOWPOSCHANGED 0x0047 //窗口位置已经改变
#define WM_SIZE 0x0005 //当窗口大小改变时发送
#define WM_MOVE 0x0003 //移动窗口时发送 最后一个UpdateWindow是调用窗口过程函数,一个WM_PAINT消息,也是直接调用,用来画窗口的客户区,因为此时客户区是无效的! WM_PAINT消息中默认是用BeginPaint(hwnd,&ps)第二个参数是PAINTSTRUCT结构: t ypedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT 调用BeginPaint后返回无效区域的信息到ps中,同时把无效区域变成有效区域!这样系统就不会重复发送WM_PAINT消息了。该函数返回一个DC,这个DC是无效区域的,所以要是用这个DC画只能画在无效区域,其他地方画不了!