网站大量收购独家精品文档,联系QQ:2885784924

MFC生命周期.docxVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MFC生命周期

1、MFC程序的启动过程MFC的封装机制隐藏了函数的执行过程,这使MFC程序不如传统的Win32程序具有清晰的运行流程。但是作为Windows程序,MFC程序也有WinMain。 下面的启动过程分析基于单文档应用程序SinDocEx:2、MFC程序的挂起状态Run——程序挂起Run函数通过消息循环,检查消息队列中是否有需要处理的消息。如果有消息需要处理,则Run就调度它;如果没有任何消息需要处理,则Run调用OnIdle,以便执行用户或框架需要完成的空闲时间处理。如果没有任何消息,也没有任何可执行的空闲处理,则应用程序一直等待消息产生,应用也就被挂起。空闲处理MFC程序的空闲处理,及Run中的OnIdle。MFC实现了这样一个Idle处理机制:在没有消息可以处理时,进行Idle处理。3、MFC程序的终止一个MFC应用程序的生命周期(一)程序的进入点??????? MFC作为Win32 API的一种封装,它的程序进入点自然是WinMain。但是,这个WinMain也被封装起来,用户是看不到的,只是在编译器进行连接时会被自动连接。??????? 下面我们就来寻找一下MFC程序被隐藏了的WinMain。搜索MFC的源文件,可以发现MFC的WinMain定义在 appmodul.cpp中。 此文件可以在VC的MFC src文件夹中找到extern C int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, ???????? __in LPTSTR lpCmdLine, intnCmdShow) ...{ ????????// call shared/exported WinMain????????returnAfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } ??????? ??????? 这里的名字虽然是_tWinMain但是我们使用“转到定义”菜单项跳转,会发现实际上这是一个宏:??????? #define _tWinMain?? wWinMain??????? 作为测试我们在VS中新建一个SDI MFC工程,起名为Test,VC会自动生成五个类 CAboutDlgCMainFrameCTestAppCTestDocCTestView??????? ??????? 在appmodul.cpp中的WinMain中加入一个断点,然后运行程序。这时我们会发现程序在_tWinMain的断点停住,说明_tWinMain正是MFC程序包裹之下的WinMain(二) WinMain的工作与生命周期??????? 继续先前追溯,我们注意到,在Test.cpp中定义有一个全局的对象CTestApptheApp;而每一个MFC应用程序都有这样唯一的一个从CWinApp继承来的应用程序对象。由于这个对象是全局的,将在WinMain进入之前进行构造和初始化。??????? 我们继续看看_tWinMain都进行了什么工作。在_tWinMain中只调用了 AfxWinMain函数,它 定义在WINMAIN.CPP中,部分代码如下:????? CWinThread* pThread = AfxGetThread();?????????? CWinApp* pApp = AfxGetApp();??????? /*pThread和pApp实际是相同的,因为CWinApp继承自 ??????? CWinThread,它们最终都指向CTestApp */????// AFX internal initialization ????if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow)) ????????gotoInitFailure; ????// App global initializations (rare)???? CTestApp.InitApplication 被调用 ????if (pApp != NULL !pApp-InitApplication()) ????????gotoInitFailure; ????// Perform specific initializations????? CTestApp.InitInstance被调用 初始化、显示窗口 ????if (!pThread-InitInstance()) ????...{ ????????if (pThread-m_pMainWnd != NULL) ????????...{ ???????????? TRACE(traceAppMsg, 0, Warning:

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档