这两天全窝在宿舍,看关于Windows编程的书,经过对程序的几经调试,算是对一个windows程序的生死过程有了一点粗浅的认识 !
Windows窗体程序从产生到死亡:
1. 如C语言类似,Windows程序是以WinMain()函数开始的;
2. 进入以后,先需要定义一个窗口,通过WNDCLASS结构体完成(相应的参数可参见MSDN);
3. 而后,注册该窗口 RegisterClass(&winclass),这里一般应该有异常处理!
4. 接下来就是著名的CreateWindow/CreateWindowEx登台了!具体参数传递不解释,你懂得!
原来是这样的:当Windows在WinMain中处理CreateWindow函数时,WndProc接收这个消息。 就是说,在呼叫CreateWindow时,Windows将做一些它必须做的工作。在这些工作中,Windows呼叫WndProc,将第一个参数设定为窗口句柄,第二个参数设定为WM_CREATE。简言之,程序会转到窗口消息处理函数中的WM_GREATE处!
问题是接下来真的是WM_GREATE吗?? 如果你打断点调试会发现答案是否定的!!!
其实在WM_GREATE之前还有一个消息需要处理!截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,也就是一个转化的过程,这个截获和转化的任务是由DefWindowProc函数来完成的!也就是说WM_GREATE是被二次加工的!
The DefWindowProc function calls the default window procedure to provide default processing for any window messages that an application does not process. This function ensures that every message is processed. DefWindowProc is called with the same parameters received by the window procedure(来自MSDN)
5. 下来才是WM_GREATE,(请原谅我之前的不诚实。。。)在WM_GREATE完后还会调用DefWindowProc函数,毕竟系统消息是很多的,我们处理的也就那么几个!!!
6. 在执行完WM_GREATE后,现在我们已经也了自己的Window,是不是该拿出来秀一下啊,呵呵
那就 ShowWindow (hwnd, iCmdShow) ;在这一过程中会调用DefWindowProc处理一些相关消息
问题又来了,要显示窗口那的知道它的大小啊,样式啊,等等信息。。。聪明的你肯定已经要说:“我们不是在CreateWindow时就设定好了吗?”嗯,是的! 但是事实上我们需要动态的获取当前窗口或客户区的大小,以便在改变窗体大小时不至于使程序受到影响,所以我们可以手动的设置大小! WM_SIZE
常用的是:cxClient=LOWORD(lParam) cyClient=HIWORD(lParam),如果你添加了WM_SIZE消息处理,那在显示窗体之前自然会先来响应该消息,获取相关信息。当然还有其他信息是由DefWindowProc获取的。如果你连WM_SIZE也没有,没关系包在DefWindowProc身上了!啊。。。万能的DefWindowProc!!!
7. 接下来是UpdateWindow更新窗口,窗口是要能被刷新的!在这里又是一个著名的任务WM_PAINT
WM_PAINT消息,通常发生在WINMAIN中呼叫UpdateWindow时。在最初建立窗口的时候,整个显示区域都是无效的,因为程序还没有在窗口上画什么东西。对WM_PAINT的处理几乎总是从一个BeginPaint呼叫开始: hdc = BeginPaint (hwnd, &ps) ; (ps类型是PRINTSTRUCT结构体)
而以一个EndPaint呼叫结束: EndPaint (hwnd, &ps) ;
这BeginPaint和EndPaint之间是画的内容,同时这两个函数会使显示区有效;如果窗口消息处理程序不处理WM_PAINT消息(这是很罕见的),它们必须被传送给DefWindowProc。DefWindowProc只是依次呼叫BeginPaint和EndPaint,以使显示区域有效。窗口重绘时,还会响应WM_PAINT消息
至此,一个窗口的创建已经完成,下面看一下销毁~!
8. WM_DESTROY消息是另一个重要消息。这一个消息指示,Windows正在根据使用者的指示关闭窗口
使用者最终单击了 Close按钮,或者假设用键盘或鼠标从系统菜单中选择了 Close, DefWindowProc处理这一键盘或者鼠标输入,在检测到使用者选择了Close选项之后,它给窗口消息处理程序发送一条WM_SYSCOMMAND消息。WndProc将这个消息传给DefWindowProc。DefWindowProc给窗口消息处理程序发送一条WM_CLOSE消息来响应之。WndProc再次将它传给DefWindowProc。DestroyWindow呼叫DestroyWindow来响应这条WM_CLOSE消息。DestroyWindow导致Windows给窗口消息处理程序发送一条WM_DESTROY消息。WndProc再呼叫PostQuitMessage,将一条WM_QUIT消息放入消息队列中,以此来响应此消息。这个消息导致WinMain中的消息循环终止,然后程序结束。
过程是: WM_CLOSE--->WM_DESTORY---->WM_QUIT.....
本人该开始学习WIN32编程,这是在练习过程中总结的,肯定有很多错误,希望大家不吝赐教!!!