资源描述:
《[MFC]消息机制》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、[MFC]消息机制首先,让我们看一下MFC的消息循环部分:(程序取自MFC源程序,由于篇幅,我删去了一些非重要的部分。)MFC的WinMain函数:[c]extern"C"intWINAPI_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){//callshared/exportedWinMainreturnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);}intAFXAPIAfxWinM
2、ain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){intnReturnCode=-1;CWinApp*pApp=AfxGetApp();//……//Performspecificinitializationsif(!pApp->InitInstance()){//……//初始化实例不成功,通常一个DialogBasedMFC程序必须返回FALSE//这样就可以跳过消息循环。nReturnCode=pApp->ExitInstance();gotoInitFai
3、lure;}nReturnCode=pApp->Run();//进入消息循环部分InitFailure://……//程序结束AfxWinTerm();returnnReturnCode;}intCWinApp::Run(){//……returnCWinThread::Run();//消息循环被封装在CWinThread类里。}intCWinThread::Run(){BOOLbIdle=TRUE;LONGlIdleCount=0;//死循环,只有收到WM_QUIT消息后才会退出。for(;;){while(bIdle&&!::PeekMessage(&m_m
4、sgCur,NULL,NULL,NULL,PM_NOREMOVE)){if(!OnIdle(lIdleCount++))bIdle=FALSE;}//如果消息队列中没有消息,那么就调用OnIdle函数//否则,发送消息do{if(!PumpMessage())//PumpMessage函数仅在收到WM_QUIT消息才返回FALSEreturnExitInstance();//退出死循环if(IsIdleMessage(&m_msgCur)){bIdle=TRUE;lIdleCount=0;}}while(::PeekMessage(&m_msgCur,NUL
5、L,NULL,NULL,PM_NOREMOVE));//这段程序不仅完成了消息的发送,还实现了Idle功能。//GetMessage函数在消息队列中没有消息时,将不会返回,//而是将控制权交给操作系统,直到消息队列中有消息为止。//这段程序在一开始就调用PeekMessage函数来检测消息队列中//是否有消息存在,如果存在就发送消息,//否则就意味着空闲,那么就调用OnIdle函数,//这样做,控制权永远不会交给操作系统。//由于Windows95,NT都是抢占式的操作系统,//系统会自动进行任务切换。//所以不用担心别的程序不会被运行。}}BOOLCWin
6、Thread::PumpMessage(){if(!::GetMessage(&m_msgCur,NULL,NULL,NULL)){//收到WM_QUIT消息,就返回FALSE。returnFALSE;}//否则就发送消息if(m_msgCur.message!=WM_KICKIDLE&&!PreTranslateMessage(&m_msgCur)){::TranslateMessage(&m_msgCur);::DispatchMessage(&m_msgCur);}returnTRUE;}[/c]主程序的流程:[text](程序开始)
7、
8、vWinMai
9、n
10、
11、vAfxWinMain
12、
13、vFALSECWinApp::InitInstance——->退出程序
14、
15、TRUE
16、vCWinApp::Run
17、
18、vCWinThread::Run
19、
20、<—————————-+vFALSE
21、PeekMessage——->OnIdle——–+
22、TRUE
23、
24、<————————-+
25、v
26、
27、GetMessage
28、
29、
30、
31、
32、
33、
34、
35、YESv
36、
37、+—–WM_QUIT消息?
38、
39、
40、
41、
42、
43、
44、
45、NO
46、
47、
48、v
49、
50、
51、TranslateMessage
52、
53、
54、
55、
56、
57、
58、
59、
60、
61、
62、v
63、
64、
65、DispatchMessage
66、
67、
68、
69、
70、
71、
72、
73、
74、
75、
76、vTRUE
77、
78、
79、PeekMe
80、ssage——————>+
81、
82、
83、
84、
85、
86、FALSE
87、
88、