|
五 程序流程分析(粗体部分) 1. 当用户进行如调整窗口大小,移动窗口位置等等的操作时。会产生不同的消息。(当然包括了ShowWindow( )函数产生的若干个消息。
2. Window系统会将这些消息排入本线程的消息队列中。(在操作系统中完成)
3. 只要该窗口消息队列中有消息,我们的GetMessage(&msg,NULL,0,0)就会从消息队列中摘取一个消息的信息,填入msg结构体变量中,如果不是WM_QUIT则返回非零值,就执行循环体。(注意:如果消息队列中没有任何消息可取时,则程序会停在GetMessage函数里,直到消息队列中有了消息,GetMessage函数才会取一个消息信息并返回。)
4. 用TranslateMessage(&msg)对msg中的数据进行预处理(你先不必知道它具体做了什么,但不要忘记这个函数。)。
5. 然后是调用DespatchMessage(&msg),这个函数里会调用WinProc,并将msg中的数据通过WinProc的参数传递给WinProc;
6. 程序转入执行WinProc回调函数体内的代码。
7. 看代码处,WinProc此时只有一句 return DefWindowProc(hwnd, msg, wparam, lparam);这里,我们只是将WinProc传入的参数原样地传给了API函数DefWindowProc。所有的消息都让DefWindowProc进行缺省默认的处理。(你不用理会DefWindowProc都做了些什么。)
8. DefWindowProc完成一个消息处理后,返回消息处理的结果。
9. 我们的WinProc也原样地将DefWindowProc返回值返回。
10. WinProc执行完成后,程序又返回到DispatchMessage(&msg)函数体内。(因为是在DispathMessage( )中调用WinProc的。)
11. 退出DispatchMessage(&msg);函数后程序又执行下一个循环。即
while(GetMessage(&msg, NULL, 0, 0))
又取下一个消息,进行下一个消息的处理。
12. 直到GetMessage “摘取”到了退出程序的消息WM_QUIT,返回零值,退出循环,结束程序。
(哦,整个流程是通过我们的程序与Window系统相互协作来完成的。你可要多加理解罗!) |
|
|