【vc++精品源码栏目提醒】:网学会员在vc++精品源码频道为大家收集整理了“VC编程技术600个大型项目源码 - 软件工程“提供大家参考,希望对大家有所帮助!
学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。
MFC消息机制首先让我们看一下 MFC 的消息循环部分:(程序取自 MFC 源程序,由于篇幅,我删去了一些非重要的部分。
)MFC 的 WinMain 函数:cextern C int WINAPI_tWinMainHINSTANCE hInstance HINSTANCE hPrevInstanceLPTSTR lpCmdLine int nCmdShow// call shared/exported WinMainreturn AfxWinMainhInstance hPrevInstance lpCmdLine nCmdShowint AFXAPI AfxWinMain HINSTANCE hInstance HINSTANCE hPrevInstanceLPTSTR lpCmdLine int nCmdShowint nReturnCode -1CWinApp pApp AfxGetApp// ……// Perform specific initializationsif pApp-InitInstance// ……//初始化实例不成功,通常一个 Dialog Based MFC 程序必须返回 FALSE//这样就可以跳过消息循环。
nReturnCode pApp-ExitInstancegoto InitFailurenReturnCode pApp-Run //进入消息循环部分InitFailure:// ……// 程序结束AfxWinTermreturn nReturnCodeint CWinApp::Run// ……return CWinThread::Run // 消息循环被封装在 CWinThread 类里。
int CWinThread::RunBOOL bIdle TRUELONG lIdleCount 0// 死循环,只有收到 WM_QUIT 消息后才会退出。
for while bIdle ::PeekMessagem_msgCur NULL NULL NULL PM_NOREMOVEif OnIdlelIdleCountbIdle FALSE// 如果消息队列中没有消息,那么就调用 OnIdle 函数// 否则,发送消息doif PumpMessage// PumpMessage 函数仅在收到 WM_QUIT 消息才返回 FALSEreturn ExitInstance // 退出死循环if IsIdleMessagem_msgCurbIdle TRUElIdleCount 0 while ::PeekMessagem_msgCur NULL NULL NULL PM_NOREMOVE// 这段程序不仅完成了消息的发送,还实现了 Idle 功能。
// GetMessage 函数在消息队列中没有消息时,将不会返回,// 而是将控制权交给操作系统,直到消息队列中有消息为止。
// 这段程序在一开始就调用 PeekMessage 函数来检测消息队列中// 是否有消息存在,如果存在就发送消息,// 否则就意味着空闲,那么就调用 OnIdle 函数,// 这样做,控制权永远不会交给操作系统。
// 由于 Windows 95 NT 都是抢占式的操作系统,// 系统会自动进行任务切换。
// 所以不用担心别的程序不会被运行。
BOOL CWinThread::PumpMessageif ::GetMessagem_msgCur NULL NULL NULL// 收到 WM_QUIT 消息,就返回 FALSE。
return FALSE// 否则就发送消息if m_msgCur.message WM_KICKIDLE PreTranslateMessagem_msgCur::TranslateMessagem_msgCur::DispatchMessagem_msgCurreturn TRUE/c主程序的流程:text程序开始vWinMainvAfxWinMainv FALSECWinApp::InitInstance——- 退出程序TRUEvCWinApp::RunvCWinThread::RunOnIdle——–TRUE FALSE —————————–v程序结束/text现在,再让我们来看一下 MFC 的窗口是如何响应消息的。
我们先来看一段建立一个窗口的代码.cclass CMsgWnd : public CWndpublic:CMsgWnd // ClassWizard generated virtual function overrides//AFX_VIRTUALCMsgWndvirtual BOOL CreateCWnd pParentWnd//AFX_VIRTUALvirtual CMsgWnd protected://AFX_MSGCMsgWndafx_msg void OnPaintafx_msg void OnLButtonDownUINT nFlags CPoint point//AFX_MSGDECLARE_MESSAGE_MAPBEGIN_MESSAGE_MAPCMsgWnd CWnd//AFX_MSG_MAPCMsgWndON_WM_PAINTON_WM_LBUTTONDOWN//AFX_MSG_MAPEND_MESSAGE_MAPBOOL CMsgWnd::CreateCWnd pParentWndreturn CWnd::CreateAfxRegisterWndClassCS_DBLCLKSMessage Window WS_VISIBLEWS_CHILD CRect00100100pParentWnd 12345void CMsgWnd::OnPaintCPaintDC dcthis // device context for paintingdc.TextOut00hellovoid CMsgWnd::OnLButtonDownUINT nFlags CPoint pointMessageBoxOnLButtonDownCWnd::OnLButtonDownnFlags point/c以上是一段标准的 CWnd 窗口类