【vc++精品源码栏目提醒】:网学会员为需要vc++精品源码的朋友们搜集整理了VC编程技术600个大型项目源码 - 讲义教程相关资料,希望对各位网友有所帮助!
MFC消息机制 首先让我们看一下MFC的消息循环部分程序取自MFC源程序由于篇幅我删去了一些非重要的部分。
MFC的WinMain函数 c extern quotCquot int WINAPI _tWinMainHINSTANCE hInstance HINSTANCE hPrevInstance LPTSTR lpCmdLine int nCmdShow // call shared/exported WinMain return AfxWinMainhInstance hPrevInstance lpCmdLine nCmdShow int AFXAPI AfxWinMain HINSTANCE hInstance HINSTANCE hPrevInstance LPTSTR lpCmdLine int nCmdShow int nReturnCode -1 CWinApp pApp AfxGetApp // ???? // Perform specific initializations if pApp-gtInitInstance // ???? //初始化实例不成功通常一个Dialog Based MFC程序必须返回FALSE //这样就可以跳过消息循环。
nReturnCode pApp-gtExitInstance goto InitFailure nReturnCode pApp-gtRun //进入消息循环部分 InitFailure: // ???? // 程序结束 AfxWinTerm return nReturnCode int CWinApp::Run // ???? return CWinThread::Run // 消息循环被封装在CWinThread类里。
int CWinThread::Run BOOL bIdle TRUE LONG lIdleCount 0 // 死循环只有收到 WM_QUIT 消息后才会退出。
for while bIdle ampamp ::PeekMessageampm_msgCur NULL NULL NULL PM_NOREMOVE if OnIdlelIdleCount bIdle FALSE // 如果消息队列中没有消息那么就调用OnIdle函数 // 否则发送消息 do if PumpMessage // PumpMessage函数仅在收到WM_QUIT消息才返回FALSE return ExitInstance // 退出死循环 if IsIdleMessageampm_msgCur bIdle TRUE lIdleCount 0 while ::PeekMessageampm_msgCur NULL NULL NULL PM_NOREMOVE // 这段程序不仅完成了消息的发送还实现了Idle功能。
// GetMessage函数在消息队列中没有消息时将不会返回 // 而是将控制权交给操作系统直到消息队列中有消息为止。
// 这段程序在一开始就调用PeekMessage函数来检测消息队列中 // 是否有消息存在如果存在就发送消息 // 否则就意味着空闲那么就调用OnIdle函数 // 这样做控制权永远不会交给操作系统。
// 由于Windows 95 NT都是抢占式的操作系统 // 系统会自动进行任务切换。
// 所以不用担心别的程序不会被运行。
BOOL CWinThread::PumpMessage if ::GetMessageampm_msgCur NULL NULL NULL // 收到 WM_QUIT 消息就返回 FALSE。
return FALSE // 否则就发送消息 if m_msgCur.message WM_KICKIDLE ampamp PreTranslateMessageampm_msgCur ::TranslateMessageampm_msgCur ::DispatchMessageampm_msgCur return TRUE /c 主程序的流程 text 程序开始 v WinMain v AfxWinMain v FALSE CWinApp::InitInstance——-gt 退出程序 TRUE v CWinApp::Run v CWinThread::Run lt—————————- v FALSE PeekMessage——-gtOnIdle——– TRUE lt————————- v GetMessage YES v —–WM_QUIT 消息 NO v TranslateMessage v DispatchMessage v TRUE PeekMessage——————gt FALSE —————————– v 程序结束/text 现在再让我们来看一下MFC的窗口是如何响应消息的。
我们先来看一段建立一个窗口的代码. c class CMsgWnd : public CWnd public: CMsgWnd // ClassWizard generated virtual function overrides //AFX_VIRTUALCMsgWnd virtual BOOL CreateCWnd pParentWnd //AFX_VIRTUAL virtual CMsgWnd protected: //AFX_MSGCMsgWnd afx_msg void OnPaint afx_msg void OnLButtonDownUINT nFlags CPoint point //AFX_MSG DECLARE_MESSAGE_MAP BEGIN_MESSAGE_MAPCMsgWnd CWnd //AFX_MSG_MAPCMsgWnd ON_WM_PAINT ON_WM_LBUTTONDOWN //AFX_MSG_MAP END_MESSAGE_MAP BOOL CMsgWnd::CreateCWnd pParentWnd return CWnd::CreateAfxRegisterWndClassCS_DBLCLKS quotMessage Win