MFC生命周期[收集].pdfVIP

  • 11
  • 0
  • 约5.01千字
  • 约 4页
  • 2021-10-19 发布于福建
  • 举报
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 hPrevInstanc e, __in LPTSTR lpCmdLine, int nCmdShow) { // call share d/exported WinMain return AfxWinMain(hInstance, hPrevInstance, lpCmdLi ne, 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 = AfxGe tApp (); /*pThread 和 pApp 实际是相同的,因为 CWinApp继承自 CWinThread, 它们最终都指向

文档评论(0)

1亿VIP精品文档

相关文档