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

MFC框架程序剖析

 
阅读更多


MFC程序的运行过程:


(1)首先利用全局应用程序对象theApp启动应用程序。正是产生了这个全局对象,基类CWinApp中的this指针才能指向这个对象。如果没有这个全局对象,程序在编译时不会出错,但在运行时就会出错。


(2)调用全局应用程序对象的构造函数,从而就会先调用其基类CWinApp的构造函数。后者完成应用程序的一些初始化工作,并将应用程序对象的指针保存起来。


(3)进入WinMain函数。在AfxWinMain函数中可以获取子类(对Test程序来说,就是CTestApp类)的指针,利用此指针调用虚函数:InitInstance,根据多态性原理,实际上调用的是子类(CTestApp)的InitInstance函数。后者完成应用程序的一些初始化工作,包括窗口类的注册、创建,窗口的显示和更新。期间会多次调用CreateEx函数,因为一个单文档MFC应用程序有多个窗口,包括框架窗口、工具条、状态条等。


(4)进入消息循环。虽然也设置了默认的窗口过程函数,但是MFC应用程序实际上是采用消息映射机制来处理各种消息的。当收到WM_QUIT消息时,退出消息循环,程序结束。

 

面已经知道,在一个windows程序中,winmain函数作为程序的入口函数,一个程序的是:设计窗口(给窗口设置相应的属性)-->注册窗口-->创建窗口-->显示并且更新窗口-->消息循环;

  但是当创建一个MFC程序时候,并没有看到winmain函数之类的东西,并且之前的程序框架与MFC也大有不同。现在,先来看看MFC中的程序框架以及程序运行机制吧。

  由于MFC是对其SDK的封装,所以程序运行逻辑方式应该是一样的。

  在MFC程序中,同样还是有winmain函数参与,但是这个WinMain函数是在程序编译连接时,由链接器将该函数链接到程序的。知道WinMain的存在后,那么WinMain又是怎么跟其他类组织在一起的呢?

  (1)CxxxApp中,有一个theApp对象的全局对象,该对象就表示了应用程序本身。对于全局对象theApp,它是在程序进入WinMain函数之前为其分配的空间,同时,定义其时候会调用它的构造函数。在程序中看到CxxxApp是CWinApp的子类,当调用CxxxApp的构造函数之前,会调用其父类的构造函数。程序的初始化在CWinApp构造函数完成。

  (2)AfxWinMain函数:WinMain函数实际上是通过调用AfxWinMain函数来完成其功能的。AfxWinMain源代码在MFC源代码的WINMAIN.CPP文件中。AfxWinMain首先通过调用AfxGetThread函数获得一个CWinThread类型的指针,接着调用AfxGetApp函数获得一个CWinApp类型的指针。由于CWinApp继承自CWinThread,AfxGetThread函数实际上返回的是AfxGetApp函数的结果,因此上面所说的AfxGetThread函数获得一个CWinThread类型的指针,接着调用AfxGetApp函数获得一个CWinApp类型的指针所得到的两个指针实际上是一致的。都指向theApp全局对象。

  (3)InitInstance函数:接下来pThread和pApp调用了三个函数(在AfxWinMain所在的文件WINMAIN.CPP中可以看到)。分别是pApp->InitApplication();pThread->InitInstance();pThread->Run();三个函数。这三个函数完成了程序所需要的几个步骤:设计窗口类,注册窗口类,显示窗口类,消息循环,以及窗口过程函数。(通过进一步的跟进每个函数可以发现这三个函数最终需要调用跟win32中程序完成这些功能的函数的影子!)

  设计和注册窗口:MFC已经为我们预定义了一些默认的标准窗口类,而注册窗口类是由AfxEndDeferRegisterClass函数完成。(AfxEndDeferRegisterClass函数首先获得窗口类的信息,如果该窗口类已经注册,直接返回一个真值,否则,调用RegisterClass函数注册该窗口类。其与win32SDK中所使用的函数是一样的啊!)

  创建窗口:窗口的创建是由CWnd类中的CreateEx函数实现的,在MFC中,CFrameWnd类的Create函数内部调用了上述的CreateEx函数,而前者又是由CrameWnd中的LoadFrame函数调用!!!在CreateEx函数的实现过程中,调用了PreCreateWindow,而后者是一个虚函数,故此调用是调用子类的PreCreateWindow函数,之所以这样是在窗口产生之前让程序员能够有机会修改窗口的外观。参数类型是一个CREATESTRUCT结构体。

  显示与更新窗口:CxxxApp类中有一个m_pMainWnd的成员变量,是一个CWnd类型的指针,保存了应用程序窗口的指针。通过它调用与SDK中一样的ShowWindow与UpdateWindow函数完成任务。

  消息循环:前面已经提到过pThread->Run();这个函数就是实现了消息循环。在这个函数中的for循环中,执行了我们认识的TransLateMessage与DisPatchMessage两个函数;

  窗口过程:在AfxEndDeferRegisterClass函数的源程序中,其中有一行言谢眼熟的代码:wndcls.lpfnwndProc=DefWindowProc;当然MFC程序并不是把所有的消息都交给DefWindowProc窗口过程来处理。MFC中使用的是消息映射机制!

  一个MFC消息响应函数在程序中有三处相关的信息:函数原型,函数实现,用来关联消息和消息响应函数的宏。(分别分布在头文件及源文件中)

  头文件中在两个AFX_MSG 注释宏之间是消息响应函数的原型的声明。源文件中有两处:

  (1)AFX_MSG_MAP注释宏之间的消息映射宏,通过这个宏把消息与消息响应函数关联起来;

  (2)源文件中消息响应函数的实现代码。

  MFC中的消息映射机制的实现方法:在每个能接收和处理消息的类中,定义一个消息和消息的处理函数静态对照表,即消息映射表。在消息映射表中,消息与对应的消息处理函数指针成对出现。某个类能处理的所有的消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否函数该消息,就可以知道该内能够处理此消息。如果能,则依照静态表找到对应的消息处理函数。否则,将消息传给其父类。

 

;

}

nReturnCode = pThread->Run();

 

InitFailure:

#ifdef _DEBUG

// Check for missing AfxLockTempMap calls

if (AfxGetModuleThreadState()->m_nTempMapLock != 0)

{

TRACE1("Warning: Temp map lock count non-zero (%ld).\n",

AfxGetModuleThreadState()->m_nTempMapLock);

}

AfxLockTempMaps();

AfxUnlockTempMaps(-1);

#endif

 

AfxWinTerm();

return nReturnCode;

}

pThreadpApp所指向的都是CTestApp类的对象,即theApp全局对象。

上面代码中,pThreadpApp调用了三个函数。

pApp首先调用InitApplication函数,该函数完成MFC内部管理方面的工作。接着,调用pThreadInitInstance函数。最后pThread调用RUN()。

run()如果返回特定值,则程序结束,也就是winmain结束。

第三步

 

 

分享到:
评论

相关推荐

    MFC框架程序剖析.pdf

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

    MFC程序框架剖析.pdf

    MFC 程序框架剖析 MFC 程序框架剖析是基于 MFC 的应用程序的核心内容之一。MFC(Microsoft Foundation Classes)是 Microsoft 提供的应用程序框架,它提供了一个基于对象的编程模型,帮助开发者快速构建 Windows ...

    第三讲MFC框架程序剖析.ppt

    第三讲MFC框架程序剖析.ppt

    MFC框架程序分析

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

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

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

    MFC-lesson3-AppWizard的原理与MFC程序框架的剖析.rar

    在本课程“MFC-lesson3-AppWizard的原理与MFC程序框架的剖析”中,我们将深入探讨MFC的核心组件,特别是AppWizard工具的使用,以及MFC程序的基本框架结构。 AppWizard是Visual C++集成开发环境中的一个实用工具,它...

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

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

    MFC程序框架的剖析

    MFC程序框架的剖析是一个深入理解MFC核心概念和技术的关键过程,这对于Windows应用开发者来说至关重要。 MFC的核心是CWinApp类,它是每个MFC应用程序的基础。这个类代表了应用程序本身,并管理着诸如初始化、消息...

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

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

    讲述MFC AppWizard的原理与MFC程序框架的剖析part06下

    讲述MFC AppWizard的原理与MFC程序框架的剖析part06下,讲述MFC AppWizard的原理与MFC程序框架的剖析part06下,讲述MFC AppWizard的原理与MFC程序框架的剖析part06下

    讲述MFC AppWizard的原理与MFC程序框架的剖析part06上

    讲述MFC AppWizard的原理与MFC程序框架的剖析part06上,讲述MFC AppWizard的原理与MFC程序框架的剖析part06上,讲述MFC AppWizard的原理与MFC程序框架的剖析part06上

    87902756MFC应用程序框架打印预览功能分析与扩展.zip

    MFC应用程序框架打印预览功能分析与扩展,自绘报表,用doc/view框架打印

    VC++ MFC框架的剖析

    学习"VC++ MFC框架的剖析",不仅可以深入了解MFC的工作原理,还能通过实践案例掌握如何在实际项目中应用MFC,提升Windows应用程序的开发能力。无论是初学者还是有经验的开发者,都可以从这份资料中获益匪浅。

    mfc应用程序在.net框架下的扩展

    本文将深入探讨MFC应用程序如何在.NET框架下进行扩展,以及这带来的好处和挑战。 一、MFC与.NET框架的融合 1. interoperability(互操作性):为了使MFC应用能够利用.NET框架的资源,开发者可以使用P/Invoke...

    第三课 讲述MFC AppWizard的原理与MFC程序框架的剖析 3.rar

    在本课程“第三课 讲述MFC AppWizard的原理与MFC程序框架的剖析 3”中,我们将深入探讨Microsoft Foundation Classes (MFC) 库中的一个重要工具——AppWizard,以及MFC程序的基本框架结构。这个课程可能包含了几个...

    将win32程序封装成MFC框架

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

    MFC程序运行机制剖析

    这个函数通过调用`AfxWinMain`来启动应用程序的主要流程,而`AfxWinMain`则是MFC框架提供的关键函数,负责初始化和运行MFC应用程序。 #### 二、全局对象与变量的生命周期 MFC程序中,全局对象或变量的生命周期开始...

    第三课 讲述MFC AppWizard的原理与MFC程序框架的剖析 1.rar

    在"第三课 讲述MFC AppWizard的原理与MFC程序框架的剖析 1.rar"这个课程中,我们将深入探讨这两个关键概念。 首先,MFC AppWizard是一个向导式应用程序生成器,它可以生成各种不同类型的MFC应用程序,包括单文档...

    MFC框架中的设计模式分析

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

Global site tag (gtag.js) - Google Analytics