MFC——2.MFC框架程序剖析

Lesson2:MFC框架程序剖析

 

微软基础类库MFC(Microsoft Foundation Class)是微软为简化程序而开发的一套C++类的集合,是一套面向对象的函数库,以类的方式提供给用户使用。MFC库是开发Windows程序的C++接口,MFC提供了面向对象的框架,开发人员基于这一框架开发Windows应用程序。MFC采用面向对象设计,将大部分WindowsAPI封装的C++的类中,以类成员函数的形式提供给开发人员使用。

 

1.一个典型的MFC单文档程序会自动生成一些类文件,包括下面几个类:

①CAboutDig类,表示对话框类,是帮助/关于窗口,这个可有可无

②CMainFrame类继承于CFrameWnd类,表示框架类窗口,一般是外面最大的那个窗口

③CXXXApp类继承于CWinApp类,表示了应用程序对象,一个程序有且仅有一个应用程序对象,程序从应用程序实例对象开始运行

④CXXXDoc类继承于CDocument类,表示文档类,数据的处理在此进行

⑤CXXXView类继承于CView类,表示视图类窗口,此窗口附在框架类窗口之上,一般是窗口中的白色区域,数据的显示在此进行

其中CFrameWnd和CView都继承于CWnd, CWnd类是MFC中一个非常重要的类,它封装了与窗口相关的操作。下面是MFC类的继承关系图。

 


2.MFC程序运行机制(过程)

参考文献:http://blog.sina.com.cn/s/blog_752af88e0100x17z.html

对于普通的VC++控制台程序,无论全局变量还是全局对象(类),程序运行时,在加载main函数之前,就已经为它们分配了内存空间。对于一个全局对象来说,此时就会调用该对象的构造函数,构造该对象,并进行初始化操作,如果是构造子类对象时,会自动调用父类的构造函数,此时在父类的构造函数中的this指针所指向的是子类对象地址。MFC程序具有一个CXXXApp类的全局对象theApp,这时this指针就可以指向这个全局对象,程序从这里开始进行,它就是应用程序对象,也就是上一讲Windows程序内部运行机制中所讲的应用程序的实例(HINSTANCE hInstance,   // handle to current instance 当前运行实例句柄  )。在MFC程序运行时,程序执行的顺序为:theApp全局对象定义处->CXXXApp构造函数->WinMain函数->设计窗口->注册窗口->创建窗口->显示窗口->消息循环。

MFC程序的WinMain函数,在由Appwized生成的源程序中找不到这个函数,但是程序是在编译时,由链接器将它链接到程序中。

 

MFC程序的主要过程

下面的过程函数可以在程序安装文件夹中的wincore.cpp和winfrm.app等文件中寻找。

theApp->        实例化应用程序对象

CTestApp::CTestApp构造函数->    CWinApp::CWinApp构造函数->  调用构造函数实例应用程序对象,子类构造函数会调用基类的构造函数

_tWinMain(WinMain函数的宏)->   AfxWinMain函数->     进入主函数

CTestApp::InitInstance函数->           初始化应用程序,完成MFC内部管理方面的工作

窗口创建同样遵循设计、注册、创建和显示更新着几个步骤,只是在MFC中,应用程序的窗口设计已经由程序设计好了,它会根据我们在Appwized中的选项而选择已经设计好的哪个窗口。

AfxEndDeferRegisterClass函数->     注册窗口

CMainFrame::PreCreateWindow函数->

CFrameWnd::PreCreateWindow函数->

AfxDeferRegisterClass(AfxEndDeferRegisterClass函数的宏)->

CFrameWnd::Create函数->

CWnd::CreateEx函数->

CMainFrame::PreCreateWindow函数->

CWnd::CreateEx函数->         创建窗口

CMainFrame::ShowWindow函数 和 CMainFrame::UpdateWindow函数->      用于显示和更新窗口

CWinThread::Run函数 和 CWinThread::PumpMessage函数        用于完成消息循环

DefWindowProc函数        默认的窗口过程

Ps:MFC中后缀名为Ex的函数都是扩展函数。MFC程序具有两个窗口(frame框架窗口和view视类窗口),在框架窗口产生之前会调用PreCreateWindow函数。在MFC程序中,窗口的创建是由CreateEx函数实现的,当修改了CreateEx函数的CREATESTRUCT参数时,CreateWindowEx函数会根据参数发生的相应变化来创建窗口。MFC程序对消息的处理实际上是通过消息映射机制来完成的。

 

简单总结一下MFC程序的运行过程

(1)首先利用全局应用程序对象theApp启动应用程序;

(2)调用全局应用程序对象的构造函数,从而就会调用其基类CWinApp的构造函数,以完成应用程序的一些初始化;

(3)进入WinMain函数;

(4)进入消息循环。

 

3.窗口类、窗口类对象与窗口的生命周期

如果我们关闭了一个窗口,这个窗口就销毁了,那么该窗口对应的C++窗口类对象销毁了吗?

(1)当一个窗口销毁时,它会调用CWnd::DestroyWindow函数,该函数销毁窗口后,将CWnd::m_hWnd设为NULL;

(2)窗口的生命周期和C++窗口类对象theApp的声明周h期不是一致的。当一个窗口销毁时,与C++窗口类对象没有关系,它们之间的纽带仅仅在于这个C++窗口类内部的成员变      量m_hWnd,该变量保存了与这个C++窗口类对象相关的哪个窗口的句柄。当程序执行到右大括号结束时,窗口对象的生命周期结束。

(3)但是,当C++窗口类对象销毁时,与之相关的窗口也将销毁,因为它们之间的纽带m_hWnd已经断了

 

参考文献:

http://wenku.baidu.com/link?url=C7-AKI_bgfs3elYH_UWMQIZdOBEutzD5lTQLYLBFch6m8JCit5yOO8bAZ5jsFRHnNDSjGISi517y7CVFlAIxCwNy2TUEpuoaM4ySEA1nN_u

http://blog.163.com/hbu_lijian/blog/static/1261291532010231534248/


 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘 要 40多年来,计算机在处理各方面的应用发展迅速。尤其在计算机飞速发展的今天,计算机的应用已在社会的各个领域深入开来,无论是在商业,工业还是政府部门都早已普及。 本文对实现图书销售系统的关键技术MFC和ADO进行了概括的描述,探讨了MFC的宏观框架体系、构成应用程序的对象、ADO以及在VC中使用ADO的步骤。本次设计采用了MFC技术、ADO技术,并且结合Access2000来开发书店的图书销售系统。 关键词: 图书销售,MFC,ADO 目 录 1 前 言 1 2 关键技术分析 2 2.1 MFC概述 2 2.1.1 MFC的宏观框架体系 2 2.1.2 构成应用程序的对象 3 2.2 VC开发数据库之ADO 4 2.2.1 ADO概述 4 2.2.2 在VC中使用ADO 4 3 总 结 8 参考文献 9 1 前 言 在科技飞速发展的今天,计算机的应用已经深入到各行各业当中。为了提高书店日常工作效率,因此设计了图书销售系统,协助书店的图书销售的管理。该前台销售部分的开发是为了简化销售过程,能够方便快捷的销售图书,系统配合了后台管理系统和数据库使用,完成零售业的供销存等商业活动过程。本次设计的实现采用Visual C++6.0和Access 2000等工具来完成,其环境为单击环境,采用MFC连接数据库,设计出了简洁、易用的人性化界面。实现的功能有:登陆过程、增加记录、删除记录、查询功能、计费功能等。特点:操作简单,界面和谐,有一定安全性(登陆过程)和可维护性,查询和计费准确快捷等。这些功能都在系统中实现,MFC将数据库的操作封装起来,通过用户对界面的操作产生相应的消息,从而进行相对应的消息处理并得出的结果。 2 关键技术分析 根据任务书及系统的要求,采用VC++6.0和Access 2000完成整个设计。用Access 2000作为后台数据库,并运用MFC技术和ADO技术等设计出简洁、易用的符合人们使用习惯的操作界面,完成书店图书销售系统的设计与实现。 2.1 MFC概述 2.1.1 MFC的宏观框架体系 MFC[1] [4]实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板等等。 这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。 为了支持对应用程序概念的封装,MFC内部必须作大量的工作。例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值