每个MFC程序都有一个the全局对象,此对象代表了这个应用程序,程序从这里诞生。
<wbr></wbr>
1、因theApp是全局对象,所以比winmain更早初始化。
<wbr></wbr>
2、theApp的初始化,先引发了其构造函数。因theApp派生于CWinApp,则也引发了CWinApp的构造函数
<wbr></wbr>
3、CWinApp中的几条重要的初始化代码:
AFX_MODULE_STATE* pModuleState =_AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState =pModuleState->m_thread;
pThreadState->m_pCurrentWinThread<wbr>=<wbr><strong>this</strong>;</wbr></wbr>
pModuleState->m_pCurrentWinApp<wbr>=<wbr><strong>this</strong>;</wbr></wbr>
可以看到m_pCurrentWinThread与m_pCurrentWinApp现在都指向theApp。
<wbr></wbr>
4、CWinApp初始化后,进入winmain。winmain中进行了如下调用:
return<wbr><strong>AfxWinMain</strong>(hInstance,hPrevInstance, lpCmdLine, nCmdShow);</wbr>
<wbr></wbr>
5、AfxWinMain中的重要代码:
CWinThread* pThread =AfxGetThread();//AfxGetThread其实就是取得了theApp的指针
CWinApp* pApp = AfxGetApp();//AfxGetApp其实就是取的了theApp的指针
<wbr></wbr>
AfxGetThread的定义:
CWinThread* AFXAPIAfxGetThread()
{
<wbr><wbr>AFX_MODULE_THREAD_STATE*pState = AfxGetModuleThreadState();<br><wbr> CWinThread* pThread=<wbr><strong>pState->m_pCurrentWinThread</strong>;</wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr>if(pThread == NULL)<br><wbr><wbr><wbr><wbr><wbr>pThread =<wbr><strong>AfxGetApp();</strong></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr>returnpThread<strong>;//pThread指向theApp</strong></wbr>
}
<wbr></wbr>
AfxGetApp的定义:
_AFXWIN_INLINE CWinApp*AFXAPI AfxGetApp()
<wbr>{ return afxCurrentWinApp; }</wbr>
<wbr></wbr>
#defineafxCurrentWinApp<wbr><wbr><wbr>AfxGetModuleState()-><strong>m_pCurrentWinApp//</strong>AfxGetApp也返回了theApp的指针。</wbr></wbr></wbr>
<wbr></wbr>
AfxWinInit(hInstance, hPrevInstance, lpCmdLine,nCmdShow);//内部的初始化操作
节选其中的一些重要代码:
// fill in the initialstate for the application
CWinApp* pApp = AfxGetApp();
if (pApp != NULL)
<wbr>{<br><wbr><wbr>// Windows specificinitialization (not done if no CWinApp)<br><wbr><wbr>pApp->m_hInstance= hInstance;<br><wbr><wbr>pApp->m_hPrevInstance= hPrevInstance;<br><wbr><wbr>pApp->m_lpCmdLine= lpCmdLine;<br><wbr><wbr>pApp->m_nCmdShow= nCmdShow;<br><wbr><wbr>pApp->SetCurrentHandles();<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
pApp->InitApplication();
这里相当于调用了theApp的InitApplication,但因大多数情况下无需改写此虚函数,所以实际调用的是CWinApp::InitApplication.其中的操作是为MFC内部管理而做,与DocumentTemplate有关。
<wbr></wbr>
pThread->InitInstance();
这里相当于调用了theApp的InitInstance,因theApp中改写了这个虚函数,所以直接调用即可。节选其中的重要代码:
<wbr></wbr>
//new一个CMultiDocTemplate对象并初始化,用来管理Doccument/view/Frame三者之间的关系
CMultiDocTemplate*pDocTemplate;
<wbr>pDocTemplate = new CMultiDocTemplate(<br><wbr><wbr>IDR_MDITYPE,<br><wbr><wbr>RUNTIME_CLASS(CMDIDoc),<br><wbr><wbr>RUNTIME_CLASS(CChildFrame), //custom MDI child frame<br><wbr><wbr>RUNTIME_CLASS(CMDIView));<br><wbr>AddDocTemplate(pDocTemplate);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
//主框架窗口的初始化
CMainFrame* pMainFrame =new CMainFrame;
//LoadFrame会触发WM_CREATE消息(中间一系列调用不详述了)
<wbr>if(!pMainFrame->LoadFrame(IDR_MAINFRAME))<br><wbr><wbr>returnFALSE;</wbr></wbr></wbr>
<wbr>m_pMainWnd = pMainFrame;</wbr>
<wbr></wbr>
CMainFrame::OnCreate中,主要实现工具栏、状态栏的初始化。
<wbr></wbr>
//显示主框架窗口,并发出更新窗口
<wbr>pMainFrame->ShowWindow(m_nCmdShow);<br><wbr>pMainFrame->UpdateWindow();</wbr></wbr>
<wbr></wbr>
pThread->Run();
这里相当于调用了theApp的Run,但是theApp通常不会改写这个虚函数,所以实际调用的是CWinApp的Run。节选一些代码:
intCWinApp::Run()
<wbr><wbr><wbr>return CWinThread::Run();</wbr></wbr></wbr>
<wbr></wbr>
intCWinThread::Run()
{
<wbr><wbr>do<br><wbr><wbr>{<br><wbr><wbr><wbr><wbr>if(!PumpMessage())<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>returnExitInstance();<strong>//收到WM_QUIT消息</strong></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>if(IsIdleMessage(&m_msgCur))<br><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>bIdle = TRUE;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>lIdleCount = 0;<br><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>}while (::PeekMessage(&m_msgCur, NULL, NULL, NULL,PM_NOREMOVE));</wbr></wbr>
}
<wbr></wbr>
BOOLCWinThread::PumpMessage()
{
<wbr><wbr><wbr><wbr>if (!::GetMessage(&m_msgCur, NULL, NULL,NULL))</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>return FALSE<strong>;//如取得的消息是WM_QUIT,则返回FALSE</strong></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>if (m_msgCur.message != WM_KICKIDLE&&!PreTranslateMessage(&m_msgCur))<br><wbr><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>::TranslateMessage(&m_msgCur);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>::DispatchMessage(&m_msgCur);<br><wbr><wbr><wbr><wbr><wbr>}<br><wbr><wbr><wbr><wbr><wbr><wbr>returnTRUE;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
}
相关推荐
标题和描述均指向了“MFC框架程序剖析”的主题,这暗示了文档的主要内容是关于MFC(Microsoft Foundation Classes)框架的深入分析和探讨。MFC是微软为简化Windows编程而设计的一组类库,它封装了Win32 API,使得...
在"分析MFC框架的模拟代码——AnylyseMFC.rar"这个压缩包中,我们可以期待找到一些关于MFC框架的源代码实例,帮助我们理解并学习MFC的核心概念。 1. **MFC的基本架构** MFC基于面向对象编程,其核心包括类库、文档...
适合初学者学习MFC的框架,梗概的讲述了MFC框架,和常用的类及其成员函数。
### MFC框架中的设计模式分析 #### 模板方法(Template Method) 模板方法模式是一种用于代码复用的设计模式。在这一模式中,基类定义了一个算法的骨架,并将某些步骤延迟到子类实现。这种模式允许子类在不改变...
WinMain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的PreCreateWidow和OnCreate两个函数的着重分析,...
关于MFC框架的分析,对于理解面向对象程序很有用,建议参考,新学者多了解,帮助很大。
下面将详细介绍背景减除法、OpenCV库、VS2010及MFC框架,以及如何将这些元素结合在一起构建一个实时背景模型。 **背景减除法** 背景减除是通过创建和更新一个静态背景模型,然后与每一帧进行比较,找出与背景模型...
在学习如何使用MFC(Microsoft ...而通过跟随大牛作者的分析和代码调试,开发者可以更加清晰地理解整个过程的每一个细节,并对MFC框架有更深刻的认识。这对于开发高效、稳定的Windows桌面应用程序是非常有益的。
【OSG基本MFc框架】是一个面向初学者的OpenSceneGraph(OSG)与Microsoft Foundation Classes(MFC)结合的编程框架。OpenSceneGraph是一个开源的3D图形库,用于高性能的可视化应用,如虚拟现实、科学模拟和游戏开发...
总的来说,这份MFC应用框架的实例源码提供了学习MFC的基础平台,通过阅读和分析源代码,初学者可以深入了解MFC如何处理Windows消息、如何组织类结构以及如何实现多线程等关键概念,从而更好地掌握MFC开发技术。
在深入探讨如何将Win32程序封装成MFC框架之前,我们先理解这两个概念的基本含义。Win32程序是基于Microsoft Windows API(应用程序接口)编写的,它直接使用Windows操作系统提供的函数来创建用户界面和执行任务。而...
通过上述分析可以看出,MFC框架通过C++的封装性、继承性和多态性,以及一系列关键类和函数,为Windows应用程序开发提供了一套完整的解决方案。开发者只需要关注应用程序的核心逻辑,而无需关心底层的复杂细节。
下面将详细介绍MFC框架以及压缩包中包含的源文件所涉及的关键知识点。 1. **MFC基础**: MFC基于面向对象编程,提供了窗口、对话框、控件、文档、视图等基本元素的类,使得开发者可以利用这些类构建复杂的用户界面...
在Microsoft Foundation ...这不仅有助于提升你对MFC框架的理解,也有助于你开发功能丰富、用户友好的Windows应用程序。在实际编程过程中,还可以结合其他MFC类和机制,如CDocument和CView,来构建更复杂的用户界面。
MFC(Microsoft Foundation Classes)是微软提供的一种C++库,用于构建Windows应用程序...通过深入分析和实践"MFC框架程序实例mfc_project-master.zip",开发者不仅可以掌握MFC的基本用法,还能提升Windows编程的技能。
《MFC框架下的人事管理系统详解》 在计算机科学领域,开发高效且用户友好的管理软件是企业信息化建设的关键一环。MFC(Microsoft Foundation Classes)框架为Windows平台提供了强大的C++开发工具,使得开发者能够...
本项目“mfc_test.rar”是一个MFC与OpenGL结合的示例,旨在帮助开发者了解如何在Visual Studio 2005环境下搭建MFC框架,并集成OpenGL进行图形渲染。** **MFC框架的搭建过程:** 1. **创建MFC项目**:在Visual ...
在"OpenGL+MFC的框架"中,我们将探讨如何将OpenGL集成到MFC应用程序中,以便利用OpenGL的强大图形功能。首先,我们需要确保系统已安装支持OpenGL的图形驱动,并且开发环境(如Visual Studio)配置正确。在MFC项目中...