MFC框架基础介绍课件_第1页
MFC框架基础介绍课件_第2页
MFC框架基础介绍课件_第3页
MFC框架基础介绍课件_第4页
MFC框架基础介绍课件_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MFC框架基础介绍讲师:鲍钰ybao@1/31/20241精选课件MicrosoftFoundationClass微软基础类1/31/20242精选课件MFC基础用传统的Windows编程方法开发应用程序,你会深刻地体会到,即使是开发一个简单地Windows应用程序也需要对Windows的编程原理有很深刻的认识,同时也要手工编写很多的代码。因为程序的出错率几乎是随着代码长度的增加呈几何级数增长的,这就使得高度程序变得非常困难。所以传统的Windows编程是需要极大的耐心和丰富的编程经验的。1/31/20243精选课件MFC基础近几年来,面向对象技术无论是在理论还是实践上都在飞速地发展。面向对象技术中最重要的就是“对象”的概念,它把现实世界中的气球、自行车等客观实体抽象成程序中的“对象”。这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。如气球的体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球能飞、自行车能滚动等。一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要调用对象所提供的方法来完成特定的功能。从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。1/31/20244精选课件MFC基础MFC的英文全称是MicrosoftFundationClasses,即微软的基本类库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,自从1993年美国微软公司推出VisualC++1.0后便配套推出了微软基础类库MFC1.0(MicrosoftFounddationClass)。MFC1.0第一个拉开了以面向对象的程序设计方法编制多任务、多进程的GUI应用软件系统的序幕。微软公司在16位平台上几乎没有停留多久,便陆续推出了MFC1.5,MFC2.0(含支持32位的Win32),MFC3.0,MFC4.0。1997年5月随着VisualC++5.0的问世,人们看到了支持Web应用和ActiveX的MFC6.0基础类库系统。1/31/20245精选课件MFC基础虽然我们要编写的程序在功能是千差万别的,但从本制裁上来讲,都可以化归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因,在这个类库中包含了100多个程序开发过程中最常用到的对象。在进行程序设计的时候,如果类库中的某个对象能完成所需的功能,这时我们只要简单地调用已有对象的方法就可以了。我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。当然,你也可以在程序中创建全新的对象,并根据需要不断完美对象的功能。1/31/20246精选课件MFC基础正是由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序良好的可调试性。1/31/20247精选课件MFC基础最后要指出的是,MFC类库在提供对象的各种属性和方法都是经过地谨慎地编写和严格地测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。MFC是很庞大的。例如,版本7.0中包含了大约200个不同的类。万幸的是,你在典型的程序中不需要使用所有的函数。事实上,你可能只需要使用其中的10多个MFC中的不同类就可以建立一个非常漂亮的程序。

1/31/20248精选课件微软基础类库MFCCDocumentCObjectCCmdTargetCWinThreadCWinAppCOleControlModuleApplicationuserdocumentCDocTemplateCSingleDocTemplateCMultiDocTemplateCViewCWndCFrameView1/31/20249精选课件MFC体系结构MFC是个相当庞大的类库,各个类间的继承与派生关系井井有条。

CObject类是MFC的基类,其它大部分类都是从CObject派生而来的。CObject类的派生类按功能可分为多个部分。下面简要介绍部分常用的类的派生结构。1/31/202410精选课件

窗口类图:部分窗口类的继承关系CObjectCCmdTargetCWndCFrameWndCViewCDialogBox1/31/202411精选课件其中,CCmdTarget(命令目标类)是MFC中拥有消息循环和消息处理机制的基类。关于MFCWindows程序中建立消息处理机制的步骤在后面详细介绍。CWnd类是从CCmdTarget中派生出来的重要类,它是所有窗口类的基类。CCmdTarget间接派生出了文档/视图结构中应用程序框架中的许多重要的类:CWinApp、CFrameWnd、CDocument、CView等(SDI应用程序框架的四个主要的类)。1/31/202412精选课件应用程序框架类图:应用程序框架类的继承关系CWinApp类是从CCmdTarget中派生出来的最重要的类,每个用MFC编写的Windows程序必须有一个它的派生类的对象,它代表一个应用程序,整个程序的运行都由它负责。CWinApp类很大程度上隐藏了APIWindows程序中WinMain函数。CObjectCCmdTargetCWinThreadCDocumentCWinApp1/31/202413精选课件图形绘制类图:图形绘制类的继承关系图形绘制类的基类是CDC(设备环境类)。CDC类提供了基本的绘图及文本输出函数。CObjectCDCCClientDCCPaintDCCWindowDC1/31/202414精选课件图形对象类

图:部分绘图对象类的继承关系绘图对象类提供给CDC及其派生类在绘图时所需的各种图形对象,如画笔、刷子、字体等。

CObjectCGdiObjectCPenCBrushCFont1/31/202415精选课件MFC体系结构MFC主要组成部分:类、宏和全局函数。类是MFC中最主要的内容。MFC类是以层次结构方式组织起来的。MFC中的类分成两部分,除了一些辅助类,大多数的MFC类是直接或间接从根类CObject派生而来。几乎每一个派生层次都与一具体的Windows实例相对应,如文档类、窗口类和视图类等。MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。

MFC约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀。

1/31/202416精选课件

宏就是用预处理指令#define定义一个标识符,用它来表示一个字符串或一段源代码。MFC宏作为MFC类库的一个组成部分在MFC应用程序中经常出现。MFC宏在Afxwin.h、Afx.h及Afxmsg_.h等MFC头文件中分别进行了定义。

MFC提供的宏有很多,常用的包括消息映射宏、运行时类型识别的宏、调试宏和异常宏等,下表列出了一般MFC编程时要用到的宏。MFC宏

1/31/202417精选课件

RUNTIME_CLASS获得运行时类的CRuntimeClass结构的指针DECLARE_DYNAMIC提供基本的运行时类型识别(声明)IMPLEMENT_DYNAMIC提供基本的运行时类型识别(实现)DECLARE_DYNCREATE动态创建(声明)IMPLEMENT_DYNCREATE动态创建(实现)DECLARE_SERIAL对象序列化(声明)IMPLEMENT_SERIAL对象序列化(实现)DECLARE_MESSAGE_MAP声明消息映射表BEGIN_MESSAGE_MAP开始建立消息映射表END_MESSAGE_MAP结束建立消息映射表ON_COMMAND命令消息映射宏ON_MESSAGE自定义消息映射宏ON_WM_…MFC预定义消息映射宏ON_BN_…,ON_CBN_…等控件通知(Notification)消息映射宏1/31/202418精选课件MFC调试宏

跟踪声明和断言在查找程序设计错误时是非常有用的。跟踪声明可以让程序在运行过程中遇到跟踪声明时在输出窗口显示指定的信息,而断言使程序在断言条件不成立时暂停程序的运行。MFC提供了一些跟踪声明和断言宏用于程序调试,这些宏只能用于DEBUG版本应用程序的调试状态。1.TRACE()宏语法说明如下:

TRACE(<表达式>);

其中参数<表达式>是由输出格式和变量等组成的输出表达式,其格式与函数printf()的参数一样,它指定调试时要在Output窗口输出的内容。1/31/202419精选课件char*szName=“LiMing”;intnAge=18;TRACE(“Name=%s,Age=%d\n”,szName,nAge);(只有在调试的时候才可以使用,才可以有结果输出)

例1

对于以下代码:调试时在Output窗口输出以下内容:Name=LiMing,Age=181/31/202420精选课件例2

设自定义一个CFrameWnd的派生类CMyFrame,在程序中构建一个与CMyFrame相关联的文档模板对象,并为构键的文档模板创建框架窗口:

CMyFrame*pFrame=(CMyFrame*)AfxGetMainWnd();

ASSERT(pFrame->IsKindOf(RUNTIME_CLASS(CMyFrame)));

//判断pFrame的类型

pFrame->DoSomeOperation();ASSERT(1==2);//当条件为假时,退出程序调试的时候可以调用1/31/202421精选课件目录MFCBaseMacro下例程F5看TRACE信息,右键ASSERT退出1/31/202422精选课件常用的MFC类

MFC库中的类按层次关系划分类根类:CObject应用程序体系结构类窗口、对话框和控件类绘图和打印类简单数据类型类数组、列表和映射类文件和数据库类Internet和网络工作类OLE类调试和异常类1/31/202423精选课件CRuntimeClass结构

CRuntimeClass在MFC中是以结构的方式定义,它含有使用CRuntimeClass结构的类的有关信息,与CObject类一同实现运行时类型识别的功能。CRuntimeClass结构包含了类名、对象所占存储空间大小及类的版本号等成员变量和动态对象创建、派生关系判断等成员函数。每个从CObject类派生的类都有一个CRuntimeClass对象同它关联。要使用CRuntimeClass结构,必须结合使用RUNTIME_CLASS()宏和其它有关运行时类型识别的MFC宏。1/31/202424精选课件CObject类

由于MFC中大部分类是从CObject类继承而来的,CObject类描述了几乎所有的MFC类的一些公共特性,CObject类为程序员提供了对象诊断、运行时类型识别和序列化等功能。对象诊断。MFC提供了两种诊断特性:利用成员函数AssertValid()进行对象有效性检查,使得类可以在继续运行前对自己进行正确性检查;利用成员函数Dump()输出对象的数据成员的值。

运行时访问类的信息:提供GetRuntimeClass()和IskindOf()两个成员函数来支持运行时类型识别。对象序列化。1/31/202425精选课件命令相关类:CCmdTarget类该类是CObject的子类,它是MFC库中所有具有消息映射属性的基类。消息映射规定了当一对象接收到消息命令时,应调用哪一个函数对该消息进行处理。设置光标。CCmdTarget类定义3个函数用于改变光标状态:BeginWaitCursor()将光标改为沙漏形状,EndWaitCursor()将光标改回调用BeginWait-Cursor()之前的形状,RestoreWaitCursor()用于将光标还原为等待状态。voidCMyView::OnSomeCommand(){

BeginWaitCursor(); //显示沙漏状光标

......//进行某种操作

EndWaitCursor(); //恢复原来光标的形状}1/31/202426精选课件窗口应用程序类:CWinApp类在MFC应用程序中,CWinApp类取代了WinMain()主函数在SDK应用程序中的地位。传统SDK应用程序WinMain()函数完成的工作现在由类CWinApp的InitApplication()、InitInstance()和Run()三个成员函数承担。CWinApp类封装了初始化、运行、终止应用程序的代码。在任何MFC应用程序中有且仅有一个CWinApp派生类的对象,它代表了程序中运行的主线程,也代表了应用程序本身。1/31/202427精选课件可视对象类:CWnd类CWnd类由CCmdTarget类直接派生而来,该类及其派生类的实例是一个窗口。CWnd类代表了MFC中最基本的GUI对象,它是一个功能最完善、成员函数最多的MFC类。窗口的实例包括应用程序主窗口、对话框和控件等。CWnd类提供的功能包括注册新窗口类、创建窗口及子窗口、获取窗口、管理窗口、访问窗口及控件、控制窗口光标、创建和使用句柄和支持工具提示等,CWnd提供了MFC中所有窗口类的基本功能,是CCmdTarget类的子类创建Windows窗口要分两步进行引入构造函数,构造一个CWnd对象调用Create建立Windows窗口,并将它连到CWnd对象上1/31/202428精选课件其它可视对象类视类:CView类该类表示框架窗口的客户区和显示文档数据并接收输入的客户区,其派生类主要有如下几种:CScrollView:具有滚动功能的视的基类CFormView:其布局在对话资源中定义的滚动视CEditView:具有文本编辑、查找、替换和滚动功能的视1/31/202429精选课件其它可视对象类菜单类:CMenu类该类是CObject类的子类,用于管理菜单。它是一个WindowsHMenu的封装,提供了与窗口有关的菜单资源建立、修改、跟踪及删除的成员函数。对话框类:CDialog类由于对话框是一个特殊的窗口,所以该类是从CWnd类中派生出来的。对话框子层次结构包括通用对话框类CDialog以及支持文件选择、颜色选择、字体选择、打印、替换文本的公共对话框子类。1/31/202430精选课件其它可视对象类控件类

控件子层次结构包括若干类,使用这些类可建立静态文本、命令按钮、位图按钮、列表框、组合框、滚动条、编辑框等。这些直观控件为Windows应用程序提供了各种输入和显示界面。控件条类:CControlBar类

控件条子层次结构为工具条、状态条、对话条和分割窗口建立模型。该类是CToolBar、CStatusBar、CDialogBar的基类,负责管理工具条、状态条、对话条的一些成员函数。控件条指的是连接在主窗口框架的顶部或底部的小窗口1/31/202431精选课件其它可视对象类绘画对象类:CGdiObject类图形绘画对象子层次结构以CGdiObject类为根类,可用于建立绘画对象模型,如画笔、刷子、字体、位图、调色板等。设备描述表类:CDC类该类及其子类支持设备描述表对象,是CObject类的子类。CDC类是一个较大的类,包括许多成员函数,如映射函数、绘画工具函数、区域函数等,通过CDC对象的成员函数可以完成所有的绘画工作1/31/202432精选课件CFrameWnd类CFrameWnd类是CWnd类的派生类,主要用来掌管一个窗口,它取代了SDK应用程序中窗口函数WndProc()的地位。CFrameWnd类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。CFrameWnd支持SDI界面,对于MDI界面,使用其两个派生类CMDIFrameWnd和CMDIChildWnd。CFrameWnd提供了若干个成员函数用于获得和设置活动文档、视图、图文框、标题栏、状态栏等操作。

1/31/202433精选课件CDocument和CView类CDocument类在应用程序中作为用户文档类的基类,它代表了用户存储或打开的一个文件。CDocument类的主要功能是把对数据的处理从对用户的界面处理中分离出来,同时提供了一个与视图类交互的接口。

CDocument类支持标准的文件操作,如创建、打开和存储一个文档等。CView类是MFC中一个很基本的类,它作为其它MFC视图类和用户视图派生类的基类。1/31/202434精选课件通用类此类提供了许多通用服务,例如文件I/O、诊断和异常处理等,此外还包括如数组和列表等存放数据集的类1.文件类:CFile类和CArchive类用以编写输入输出处理函数2.异常类:CException类是所有异常情况的基类。不能直接建立CException对象,只能建立派生类的对象,用派生类来捕获指定的异常情况3.模板收集类这些类可以将多种对象存放到数组、列表和“映射”中。但这些收集类是模板,它们的参数确定了存放在集合中的对象类型。1/31/202435精选课件MFC中全局函数和全局变量以Afx为前缀的函数(数据库类函数和DDX函数除外)和变量,在目前的版本中,都表示全局函数或全局变量。

AfxAbort: 无条件终止一个应用程序AfxBeginThread: 创建一个新线程并执行它AfxEndThread: 终止当前正在执行的线程AfxFormatString: 格式化字符串AfxMessageBox: 显示一个Windows消息框AfxGetApp: 返回当前应用程序对象的指针AfxGetAppName: 返回应用程序的名称AfxGetMainWnd: 返回指向应用程序主窗口的指针 AfxGetInstanceHandle:返回标识当前应用程序对象的句柄AfxRegisterWndClass:注册用于创建Windows窗口的窗口类1/31/202436精选课件例如调用AfxMessageBox函数将弹出一个消息框,其功能与CWinApp中的DoMessageBox相同。AfxMessageBox原型如下:intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0)1/31/202437精选课件intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,

UINTnIDHelp=0)

MB_ABORTRETRYIGNORE

MB_OKMB_OKCANCELMB_RETRYCANCEL

MB_YESNO

MB_YESNOCANCEL

1/31/202438精选课件常用的三种工程1、Win32ConsoleApplication(控制台应用程序)用于创建DOS控制台的C/C++程序(WindowsDOS虚拟机下的DOS程序),简称DOS程序。2、Win32Application(Windows应用程序:C或底层面向对象程序)用于创建的WindowsC/API程序或MFCWindows程序(MFC:MicrsoftFoundationClasses,VC6.0预定了近二百三十个类)3、MFCAppWizard(MFCWindows程序)用向导创建MFCWindows程序,并生成应用程序框架(即自动生成底层代码)。编程时在原代码基础上增加新的应用代码即可。1/31/202439精选课件用Win32ConsoleApplication创建DOS控制台程序

用Win32Application创建Windows程序

1、创建WindowsAPI程序

2、创建MFCWindows程序

1/31/202440精选课件用MFCAppWizard创建MFCWindows程序该工程创建程序的类型:1、Dialogbased;2、SDI;3、MDI例:用MFCAppWizard创建SDI单文档面应用程序,并在客户区(100,100)处开始显示“Hello,World!”的字符串。见操作演示。目录MyMFC下例程

1/31/202441精选课件创建第一个MFC程序1/31/202442精选课件Step11/31/202443精选课件Step21/31/202444精选课件Step31/31/202445精选课件Step41/31/202446精选课件Step51/31/202447精选课件Step61/31/202448精选课件Step71/31/202449精选课件单文档应用程序创建的类CAboutDlg 对话框类CMyMFCApp 应用程序类CMyMFCDoc 文档类CMyMFCView 视图类CMainFrame 框架类1/31/202450精选课件1/31/202451精选课件1/31/202452精选课件尽管每个应用程序具体实现的功能不同,但同一类程序的基本结构是相同的。因此,通常采用MFCAppWizard创建一个MFC应用程序框架。MFC不仅仅是一个类库,它还提供了一层建立在MFC类对象封装上的附加应用程序框架。应用程序框架是为了生成一般的应用程序所必需的各种软组件的集成。类库只是一种可以嵌入到任何程序中的、提供某些特定功能的类的集合。而应用程序框架却定制了应用程序的结构和源代码,其中的类对象既相互独立、又相互作用,形成一个统一的整体。MFC应用程序框架1/31/202453精选课件MFC应用程序框架提供了构建应用程序所需要的类,在程序运行时能够生成运行时类的对象,如代表应用程序对象、文档对象、视图对象和框架窗口对象。应用程序对象theApp是一个唯一的全局变量,它的主要功能是通过调用WinMain()主函数启动程序的运行。MYMFC.CPP中代码:CMyMFCApptheApp;MFC应用程序框架也有一个作为程序入口点的WinMain()主函数,但在源程序中看不见该函数,它在MFC中已定义好并同应用程序相链接。

应用程序框架中的对象1/31/202454精选课件在MFC应用程序的CWinApp派生类对象theApp是一个全局变量,代表了应用程序运行的主线程。它在程序整个运行期间都存在,它的销毁意味着运行程序的消亡。MFC应用程序启动时,首先创建应用程序对象theApp,这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC提供的AfxWinMain()主函数。AfxWinMain()主函数首先通过调用全局函数AfxGetApp()获取应用程序对象theApp的指针pApp,然后通过pApp调用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论