`
wo_deqing
  • 浏览: 64183 次
文章分类
社区版块
存档分类
最新评论

MFC框架分析

 
阅读更多

每个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-&gt;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()-&gt;<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-&gt;m_hInstance= hInstance;<br><wbr><wbr>pApp-&gt;m_hPrevInstance= hPrevInstance;<br><wbr><wbr>pApp-&gt;m_lpCmdLine= lpCmdLine;<br><wbr><wbr>pApp-&gt;m_nCmdShow= nCmdShow;<br><wbr><wbr>pApp-&gt;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-&gt;LoadFrame(IDR_MAINFRAME))<br><wbr><wbr>returnFALSE;</wbr></wbr></wbr>

<wbr>m_pMainWnd = pMainFrame;</wbr>

<wbr></wbr>

CMainFrame::OnCreate中,主要实现工具栏、状态栏的初始化。

<wbr></wbr>

//显示主框架窗口,并发出更新窗口

<wbr>pMainFrame-&gt;ShowWindow(m_nCmdShow);<br><wbr>pMainFrame-&gt;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(&amp;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(&amp;m_msgCur, NULL, NULL, NULL,PM_NOREMOVE));</wbr></wbr>

}

<wbr></wbr>

BOOLCWinThread::PumpMessage()

{

<wbr><wbr><wbr><wbr>if (!::GetMessage(&amp;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&amp;&amp;!PreTranslateMessage(&amp;m_msgCur))<br><wbr><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>::TranslateMessage(&amp;m_msgCur);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>::DispatchMessage(&amp;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框架程序剖析.pdf

    标题和描述均指向了“MFC框架程序剖析”的主题,这暗示了文档的主要内容是关于MFC(Microsoft Foundation Classes)框架的深入分析和探讨。MFC是微软为简化Windows编程而设计的一组类库,它封装了Win32 API,使得...

    分析 MFC 框架的模拟代码——AnylyseMFC.rar

    在"分析MFC框架的模拟代码——AnylyseMFC.rar"这个压缩包中,我们可以期待找到一些关于MFC框架的源代码实例,帮助我们理解并学习MFC的核心概念。 1. **MFC的基本架构** MFC基于面向对象编程,其核心包括类库、文档...

    MFC的框架分析与常见类

    适合初学者学习MFC的框架,梗概的讲述了MFC框架,和常用的类及其成员函数。

    MFC框架中的设计模式分析

    ### MFC框架中的设计模式分析 #### 模板方法(Template Method) 模板方法模式是一种用于代码复用的设计模式。在这一模式中,基类定义了一个算法的骨架,并将某些步骤延迟到子类实现。这种模式允许子类在不改变...

    MFC AppWizard的原理与MFC程序框架的剖析

    WinMain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的PreCreateWidow和OnCreate两个函数的着重分析,...

    MFC框架程序分析

    关于MFC框架的分析,对于理解面向对象程序很有用,建议参考,新学者多了解,帮助很大。

    背景减除法(opencv+vs2010+MFC框架)

    下面将详细介绍背景减除法、OpenCV库、VS2010及MFC框架,以及如何将这些元素结合在一起构建一个实时背景模型。 **背景减除法** 背景减除是通过创建和更新一个静态背景模型,然后与每一帧进行比较,找出与背景模型...

    学习MFC框架如何创建的过程.pdf

    在学习如何使用MFC(Microsoft ...而通过跟随大牛作者的分析和代码调试,开发者可以更加清晰地理解整个过程的每一个细节,并对MFC框架有更深刻的认识。这对于开发高效、稳定的Windows桌面应用程序是非常有益的。

    OSG基本MFc框架

    【OSG基本MFc框架】是一个面向初学者的OpenSceneGraph(OSG)与Microsoft Foundation Classes(MFC)结合的编程框架。OpenSceneGraph是一个开源的3D图形库,用于高性能的可视化应用,如虚拟现实、科学模拟和游戏开发...

    mfc应用框架源代码01

    总的来说,这份MFC应用框架的实例源码提供了学习MFC的基础平台,通过阅读和分析源代码,初学者可以深入了解MFC如何处理Windows消息、如何组织类结构以及如何实现多线程等关键概念,从而更好地掌握MFC开发技术。

    将win32程序封装成MFC框架

    在深入探讨如何将Win32程序封装成MFC框架之前,我们先理解这两个概念的基本含义。Win32程序是基于Microsoft Windows API(应用程序接口)编写的,它直接使用Windows操作系统提供的函数来创建用户界面和执行任务。而...

    MFC框架解析笔记

    通过上述分析可以看出,MFC框架通过C++的封装性、继承性和多态性,以及一系列关键类和函数,为Windows应用程序开发提供了一套完整的解决方案。开发者只需要关注应用程序的核心逻辑,而无需关心底层的复杂细节。

    frame_mfc 框架

    下面将详细介绍MFC框架以及压缩包中包含的源文件所涉及的关键知识点。 1. **MFC基础**: MFC基于面向对象编程,提供了窗口、对话框、控件、文档、视图等基本元素的类,使得开发者可以利用这些类构建复杂的用户界面...

    MFC框架结构分析例程(CControlBar使用演示)

    在Microsoft Foundation ...这不仅有助于提升你对MFC框架的理解,也有助于你开发功能丰富、用户友好的Windows应用程序。在实际编程过程中,还可以结合其他MFC类和机制,如CDocument和CView,来构建更复杂的用户界面。

    MFC 框架程序实例mfc-project-master.zip

    MFC(Microsoft Foundation Classes)是微软提供的一种C++库,用于构建Windows应用程序...通过深入分析和实践"MFC框架程序实例mfc_project-master.zip",开发者不仅可以掌握MFC的基本用法,还能提升Windows编程的技能。

    MFC框架下的人事管理系统

    《MFC框架下的人事管理系统详解》 在计算机科学领域,开发高效且用户友好的管理软件是企业信息化建设的关键一环。MFC(Microsoft Foundation Classes)框架为Windows平台提供了强大的C++开发工具,使得开发者能够...

    mfc_test.rar_MFC搭建_mfc框架

    本项目“mfc_test.rar”是一个MFC与OpenGL结合的示例,旨在帮助开发者了解如何在Visual Studio 2005环境下搭建MFC框架,并集成OpenGL进行图形渲染。** **MFC框架的搭建过程:** 1. **创建MFC项目**:在Visual ...

    opengl+MFC的框架

    在"OpenGL+MFC的框架"中,我们将探讨如何将OpenGL集成到MFC应用程序中,以便利用OpenGL的强大图形功能。首先,我们需要确保系统已安装支持OpenGL的图形驱动,并且开发环境(如Visual Studio)配置正确。在MFC项目中...

Global site tag (gtag.js) - Google Analytics