资源预览内容
第1页 / 共33页
第2页 / 共33页
第3页 / 共33页
第4页 / 共33页
第5页 / 共33页
第6页 / 共33页
第7页 / 共33页
第8页 / 共33页
第9页 / 共33页
第10页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第4章 MFC应用程序设计的基础知识,2,利用Windows API函数进行编程时,大量的代码需要程序员自己编写,编程的工作量较大。,通常利用MFC(Microsoft Foundation Classes)和向导(Wizard)来编写Windows应用程序。(P.14),首先使用AppWizard来生成Windows应用程序的基本框架,然后用ClassWizard来建立应用程序的类、消息处理、数据处理函数或定义控件的属性、事件和方法,最后把各应用程序所要求的功能添加到类中,3,1 MFC概述,4,MFC还很好地保持了程序的向下兼容性,是用来编写Windows应用程序的C+类集,提供了大量的基类供程序员根据不同的应用环境进行扩充,允许在编程过程中自定义和扩展应用程序中的类,较好的移植性,可移植于众多的平台,5,2 MFC类库的组织结构及主要的类,2.1 MFC类库的组织结构,(教材P.226),6,7,简单数据类型类,8,9,3 MFC中的全局函数,以Afx开头的函数除数据库类函数和DDX(Dialog Data Exchange)函数外,在目前的版本中,都表示是一个全局函数。,10,4.文档/视图结构,MFC通过文档/视图结构把对数据的管理和显示进行了分工,其中,文档负责数据的存储和管理,视图负责数据的显示。 在文档/视图结构中,文档是一个内存中的概念,它负责存储和管理应用程序在内存中的所有数据。即,它首先采用某种数据结构来存储应用程序中所有的数据,构成了应用程序所使用的数据单元;此外,它提供了管理和维护数据的手段以及存盘、读取的手段。,11,视图是一个用户界面的概念,它构成了数据的用户窗口,为用户提供了文档中的数据的可视化显示,它把文档的部分或全部内容在窗口中显示出来。视图还给用户提供了一个与文档中的数据交互的界口,它可以把用户的输入转化为对文档中数据的操作。 每个文档都会有一个或多个视图显示,这些视图可以互不相同。比如,在Excel电子表格中,我们可以将数据以表格方式显示,也可以将数据以图表方式显示。一个视图既可以输出到窗口中,也可以输出到打印机上。,12,内存,用户界面,13,MFC中,文档和视图分别用文档类和视图类来表示。每一个支持文档/视图结构的应用程序都有自己的文档类和视图类,二者都可以获得对方的指针从而进行访问。其中,文档类是从CDocument派生的,视图类是从CView或CView的派生类派生的。,14,文档/视图结构的工作机制,视图类通过GetDocument()成员函数获得指向文档类对象的指针,通过该指针获得文档类中的数据,视图类把数据显示于客户区中,用户通过与客户区的交互来对数据进行修改,视图通过调用文档类的成员函数将经过修改的数据保存回文档类对象,如果用户发出保存命令,则文档对象将修改过的数据保存到永久介质(如磁盘文件)中,15,5.应用程序向导及其应用步骤(教材P.228),从第2章可以看到,不管Windows应用程序完成何种功能,它们的框架是固定的,都必须经历注册窗口类、创建窗口、更新窗口客户区、建立消息循环这些套路。如果能把这些固定的东西简化,依靠开发工具自动为我们生成,就可以大大减轻程序员的负担,使他们能集中注意力在程序的逻辑上。,16,应用程序向导为程序员提供了一个基于MFC的应用程序框架,程序员可以在此基础上添加实现特定功能的代码即可,17,18,19,20,21,22,23,24,25,26,6.第一个MFC程序 学习向导产生的类,6.1 向导产生的4个主要类 应用程序类(从CWinApp派生) 封装与应用程序相关的操作。重要成员函数: InitInstance():当应用程序启动时由MFC自动调用,完成一些应用程序的初始化操作。 ExitInstance():当应用程序退出时由MFC自动调用,完成一些清除工作。,27,主框架类CMainFrame(从CFrameWnd派生) 封装与窗口框架相关的操作。重要成员函数: OnCreate():这个函数就是WM_CREATE消息的处理函数,当窗口刚被创建时由MFC自动调用,完成主框架的创建(包括工具栏、状态栏等的创建)。由于这个类是主框架类,所以这个函数不进行客户区的任何创建工作。 PreCreateWindow():在上一个函数被调用前,由MFC自动调用,通过修改一个CREATESTRUCT结构体变量来完成窗口创建时的一些风格定制。这是一个虚函数,我们可以重载它,然后修改CREATESTRUCT结构体变量来达到修改窗口风格的目的。,28,另外,如果应用程序是多文档界面的,那么还有一个CChildFrame类,专门负责管理各个子窗口的框架。具体内容和调用时机与CMainFrame类相似。,29,文档类(从CDocument派生) 封装文档/视图结构中与文档相关的操作,我们可以添加适合的变量或数据结构来存储和管理应用程序所需的数据。重要成员函数: OnNewDocument():虚函数,当用户点击“新建”菜单或工具栏按扭时由MFC自动调用。我们可以重载它,然后实现自己的新建文档时的初始化工作。 Serialize():虚函数,当用户点击“打开”或“保存”或“另存为”菜单或工具栏按扭时由MFC自动调用。我们一定要重载它,才能够实现自己的打开和保存工作。,30,注意: 关于Serialize(),只有4种类可以使用这个函数: CDocument及其派生类 CObArray依次调用每个元素的Serialize() CObList 依次调用每个元素的Serialize() 派生自CObject的自定义类(需在头文件中添加DECLARE_SERIAL(CXXX)宏和在源文件中添加IMPLEMENT_SERIAL(CXXX,CObject,1) 宏)。,思考: 一程序中有多个对象,并且需要将这些对象中的数据存盘。那么在文档类中应怎样进行设计?,31,视图类(从CView或其派生类派生) 封装文档/视图结构中与视图相关的操作,完成窗口客户区中的内容的绘制工作。重要成员函数: OnInitialUpdate():虚函数,类似于第2章的API函数UpdateWindow()。当窗口刚显示在屏幕上时由MFC自动调用,该函数要发出一条WM_PAINT消息,这是应用程序第一次发出该消息,作用是完成客户区的初始显示工作。我们可以重载它,实现客户区的特定初始显示。 OnDraw():虚函数,当程序收到WM_PAINT消息时由MFC自动调用,专门进行客户区的重绘。如果我们希望程序能响应WM_PAINT消息,就一定要重载它。,32,注意: OnDraw()函数只在客户区变得“无效”(即发出WM_PAINT消息)的时候,由MFC自动调用。具体的,有以下一些调用时机: 窗口刚显示出来时 窗口最小化后重新恢复显示时 窗口被其他窗口遮住全部或一部分后重新显示时 窗口被拖动时 当程序中调用CWnd:Invalidate()函数或Win32 API RedrawWindow()强制使客户区无效时,33,6.2 认识MFC的消息映射机制: MFC中没有使用我们在第2章看到的那个带有庞大switchcase结构的消息处理函数,而是定义了多个消息处理函数,让每一个处理一个特定的消息。所以,必须有一种机制能够让应用程序知道哪一个消息用哪一个函数去处理。这个机制就是消息映射。 头文件中的DECLARE_MESSAGE_MAP() 源文件中的BEGIN_MESSAGE_MAP(XXXX, XXXX) 和END_MESSAGE_MAP(),这两个宏之间的语句就是消息映射,其中每一条都规定了一个特定的消息用哪一个函数去处理。,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号