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画只能画在无效区域,其他地方画不了!

转载于:https://www.cnblogs.com/hedantou/archive/2010/09/10/1823282.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值