首先是几个名词解释:
SDK - Software Development Kit
MFC - Microsoft Foundation Class
传统的C程序从第一行带有main函数的语句开始执行,到main函数返回值结束。在首尾行之间,函数main会调用其它函数,而这些函数可能会调用更多的函数,但始终是程序而不是操作系统决定何时调用哪个函数。
Windows函数不是这么执行的,它采用了事件驱动的模型,应用程序通过处理操作系统发来的消息来响应事件。具体模型见书上图1-1。
消息伴随的是4个入口参数:消息所指窗口的句柄、一个消息ID和两个名为wParam和lParam的32位参数。窗口句柄是一个唯一的标识窗口的32位值。消息ID是标识消息类型的一个数值,比如:WM_CREATE、WM_PAINT等。
简单Windows程序的执行顺序:
Winmain函数首先调用API函数RegisterClass来注册一个WNDCLASS结构的窗口类,然后调用CreateWindow函数来生成窗口,接着调用ShowWindow(如果生成时使用了WS_VISIBLE则不用)和UpdateWindow函数来让其显示出来并立即刷新。
接下来进入消息循环,反复的调用GetMessage、TranslateMessage和DispatchMessage这3个函数。GetMessage函数从消息队列中获得出口的结构为MSG的消息并将其从队列中删除。TranslateMessage函数将键盘消息转换为更容易使用的WM_CHAR消息。DispatchMessage函数则将消息发送到窗口的消息处理(回调)函数去。
消息处理(回调)函数:在WNDCLASS中有个lpfnWndProc成员,指向了消息处理函数的地址。所谓回调函数就是指该函数是不经过用户手动调用的,操作系统根据WNDCLASS的lpfnWndProc成员内容找到该函数并自动调用以进行消息处理。该函数一般由一个switch构成,检查并处理不同的消息。在最后未手动处理的消息要通过调用DefWindowProc函数来进行默认处理。
当窗体收到WM_DESTROY消息时,应该调用PostQuitMessage函数,使GetMessage函数返回false以退出消息循环结束程序,否则窗体关了,而程序还在执行,这是不正常的。