WIN32基础总结篇
经过上面的文章,如果你能独自的写出那一百多行代码,那么我就可以明确的告诉你,你入门了!!!如果你能了解windows消息机制,那么你以后的学习会顺利的多,这篇文章是一个总结,算是对前几节课的升华!
前几节学习了消息机制和windows窗体建立的步骤,接下来我就讲解它们之间的联系。
如上图所示:
操作系统和应用程序都有各自的消息队列。操作系统各个驱动模块感知外围设备的变化(如键盘按下或鼠标移动),将这些变化包装成消息放在系统队列中。windows系统和其它windows程序传送过来的消息放在当前的应用程序队列中(windows操作系统是分时操作系统,当前程序就是CPU占用的程序,即运行的程序)。而一个应用程序的维持,靠的就是消息循环,消息循环不断地通过GetMessage API获取消息,这些消息有的来自应用程序队列,有些来自系统队列,不过对于应用程序来说,消息就是消息,消息从哪里来的并不重要,它只需要获取消息,转换消息,分派消息即可。
消息循环中的DispatchMessage经过USER模块的协助,将消息交到相应的窗口的窗口过程函数中,窗口函数通过switch语句判断消息的类型并对其处理,处理结束后又会回到消息循环。
说完程序的基本流程,下边我们讲解一下一个windows程序的生与死,学会它会让你对消息循环的理解更进一步!
如上图:
windows应用程序在运行到CreateWindow这个地方时,发送WM_CREATE消息,然后该消息被消息循环所提取,然后通过DispatchMessage将消息分派到窗口过程函数,然后switch语句处理WM_CREATE消息。程序接着运行,一直都是在获取消息、转换消息、分配消息一直到关闭窗口。窗口关闭时,系统将发送WM_CLOASE消息,如果程序处理此消息,操作系统将不处理,如果操作系统处理将会默认调用DestroyWindow将窗口清楚,并着一系列的清理工作,然后本身会发送WM_DESTROY这个消息。程序接收到WM_DESTROY这个消息,程序的反应会是调用PostQuitMessage API。此API将发送WM_QUIT消息,然后消息循环获取WM_QUIT消息,GetMessage将会返回0,然后循环结束,windows程序正常退出。
虽然过程复杂一些,带确实做到操作系统和应用程序相分离,通过消息互相沟通。还记得上节课讲解GetMessage API的第二个参数为什么设为NULL么?如果你试验了,你就会发现,程序是正常工作的,但在关闭窗口的时候,程序的窗口虽然关闭,但是进程并没有结束,这是为什么?上文提到,程序关闭的时候 系统会发送WM_CLOSE消息,注意这个消息是系统产生的,所以当你GetMessage的第二个参数设为hwnd应用程序句柄的时候,会出现程序无法接受此消息, 因为GetMessage只会获取窗口句柄为hwnd的消息,于是程序不会处理WM_CLOSE,于是接下来的一些都不会发生,直接的后果就是界面销毁程序进程还在运行中!
你理解了么?如果不理解你可以试试那就试着拦截一些消息,来看看现象……如果不理解欢迎留言讨论!
好了,如果你将教程从第一节跟到现在,那么恭喜你,你已经是一位会编windows程序的人了,在接下来的几节课我会就一些windows程序的例子开发,帮助大家理解windows程序的主框架,然后进行简单的运用。忠心的感谢大家观看此教程的内容,让我们一起努力共建美好的未来……有些扯远了!不过还是谢谢大家!
此教程参考书籍有:《深入浅出MFC》《VC++深入详解》《精通Windows API》
此教程参考视频有:《孙鑫的VC视频》

