《第05讲--MFC编程基础知识.ppt》由会员分享,可在线阅读,更多相关《第05讲--MFC编程基础知识.ppt(80页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第五讲第五讲 MFC编程基础知识中国地质大学中国地质大学中国地质大学中国地质大学(武汉武汉武汉武汉)计算机学院计算机学院计算机学院计算机学院C+C+语言程序设计语言程序设计2l5.1Windows编程概述l5.2MFC简介l5.3MFC的层次结构及其子类功能简介l5.4MFC应用程序架构35.1 Windows编程概述 Windows操作系统是一个多任务、面向对象的图形操作系统。在Windows操作环境中,Windows应用程序采用“基于消息的事件驱动”运行机制,这是它与过去的面向过程的应用程序机制的不同之处。4窗口 窗口是由应用程序创建的一个用于接收用户输入和显示输出的矩形区域。窗口由“非
2、客户区”和“客户区”组成。非客户区由系统绘制,包括菜单、工具栏、最大化按钮等。客户区由应用程序绘制,用于输出数据和接受用户的输入。Windows应用程序可以有多个窗口,每一个窗口都可以具有不同的功能。5事件和消息 Windows操作环境中,无论是系统产生的动作或是用户运行应用程序产生的动作,都称为事件产生的消息。Windows应用程序利用消息与其他的Windows应用程序及Windows系统进行信息交换。Windows 的消息由三部分组成:消息号、字参数和长参数。消息号是预先定义的消息名标志符字参数和长参数是与消息号相关的值,提供一些附加信息。6API简介API(Application Pro
3、gramming Interface)是为Windows应用程序开发提供统一的编程接口的函数。的函数。在使用API编程的过程中,窗口的创建和消息的处理都需要手工编码,一个简单的Windows应用程序都需要上百行代码,这使Windows应用程序开发变成了一件繁重的工作,但是使用API编写Windows应用程序,可以深入理解Windows应用程序的运行机制,是C+编程到MFC编程的中间过程,是事件驱动、消息处理由手工编写到自动生成的中间过渡。7句柄 Windows应用程序中,句柄是标识诸如菜单、图标、窗口、内存块、输出设备等对象的标识符号,Windows系统的各种资源都是通过句柄来访问的。句柄是作
4、为Windows系统内部表的索引值来使用的,而并非对象所在的内存地址。通过句柄只能够安全的访问对象,而不能直接访问对象的内部结构。8 GDI简介 许多MS-DOS程序都直接向视频存储区或打印机端口输送数据,这样做就需要为不同的输出设备编写不同的程序。Windows提供了一个抽象的图形界面接口,称为图形设备界面,或简称GDI。它组成了Windows操作系统的核心部分。9设备环境设备环境(Device Context),也被称为DC,是由GDI保存的一个数据结构,设备环境包含了输出设备的绘图特征。不同设备有不同的设备环境,在输出设备上输出的先决条件是获得该设备的设备环境。10画笔画笔指的是一种用于
5、画线及绘制有形边框的工具,用户可以指定它的颜色及宽度,并且可以指定它画实线、点线或虚线等。画刷定义了一种位图形式的像素,利用它可对封闭区域内部填充颜色或样式。字体是一种具有某种风格和尺寸的所有字符的完整集合。11资源 光标、位图、对话框和菜单都是资源。资源即数据,包含在应用程序的.exe文件中。当 Windows把程序装入内存执行的时候,它通常将资源留在磁盘上。只有当Windows需要某一资源时,它才将资源装入内存。资源在资源描述文件中定义。资源描述文件是以.rc为扩展名的ASCII码文件。资源描述文件可以包含用ASCII码表示的资源,也可以引用其他资源描述文件(ASCII或二进制文件)。12
6、Windows 环境下的资源主要有以下几类:加速键、工具栏、光标、对话框、图标、字符串和菜单等。Visual C+为所有类型的资源都提供了资源编辑器进行可视化的编辑。13Windows编程中的数据结构数据结构描述MSG应用程序消息的结构WNDCLASS定义窗口类PAINTSTRUCT定义窗口用户域的绘制消息RECT定义矩形14VC开发应用程序的最常用的模式就是利用MFC进行Win32应用程序的设计。MFC就是利用面向对象的思想,将Windows大部分API函数封装起来的一个浩瀚的类库,利用MFC编写程序本质上就是选择该类库中合适的类,并调用其下相应成员函数来完成某个功能。虽然MFC编程相对于A
7、PI编程简单了,但掌握却并不容易。155.2MFC概述l5.2.1什么是MFCl5.2.2MFC的发展l5.2.3MFC的设计原理l5.2.4MFC的目标l5.2.5使用C+和MFC的好处165.2.1什么是MFCMFC是MicrosoftFoundationClassLibrary(微软基础类库)的缩写。从物理角度看,它是一个庞大的类库、包含可控制计算机系统方方面面的类库,它对应的是Windows系统目录下的一系列mfc*.dll文件;从逻辑角度看,它是一个面向对象的应用程序框架,程序员可以使用这一框架创建Windows应用程序。MFC的组织是以C+类的层次形式组织在一起,几个高层类提供一般
8、功能,而低层类实现更具体的功能,每一个低层类都是从高层类派生而来,因此继承了高层类的功能。17MFC处理很多与Windows相关的常见任务,例如在后台做消息处理以及对消息进行路由选择,无需程序员在每一个开发的Windows应用程序中编写相同的消息处理循环,MFC已经实现了这一消息循环,并对大多数常见的消息提供了易学易用的消息响应函数。例如OnPain()就是CWnd类的一个成员函数,是对WM_PAINT消息进行响应的一个虚成员函数。除了类的层次外,MFC也提供了一个应用程序开发框架,此框架被称为文档/视图架构。185.2.2MFC的发展微软于1989年成立了ApplicationFramewo
9、rk开发小组,开始设计一个用于建立图形界面的可移植的C+类库。AFX(ApplicatinFramework的缩写)面向对象的技术建立一个易于使用并可移植的GUI。然而一年以后,AFX计划失败了,其主要原因是AFX开发小组过于信任面向对象程序设计方法的能力,一个纯粹抽象的类往往并不实用。19因此,AFX开发小组转向开发MFC库,并将其实现目标从多目标平台转向对WindowsAPI的封装;他们也不再试图建立高度抽象的类,而重点在于建立实际可用的类;他们还避开使用复杂的C+的结构(例如,多重继承和模板),目的是建立一个单一的类库,用来简化Windows、OS/2PresentationManage
10、r和AppleMacintosh应用程序的开发,当时,开发小组希望利用只是使用了一个C+的子集;20另外,他们不再使用抽象的类来隐藏Windows本身API的细节,而是使用户能够很方便地存取Windows原有的API。这样做有两个原因:首先,可以简化已有的Win16代码到MFC库的转换;其次,确保原有API的所有功能对应用程序都是可以使用的,这意味着可以绕过类库而直接调用这些Windows原有的API函数。21AFX和MFC的另一个区别是所使用的开发方法不同,AFX采用是自顶向下的设计方法,逐步将对象抽象出来并施加到Windows上;而MFC库采用的则是自底向上的设计方法,也就是说,从MFC的
11、第一个版本开始,它的类就是建立在已有的WindowsAPI对象基础上的,这样就避免了AFX中代码的超支与浪费。22当使用MFC进行编程时,将会发现在MFC源程序中有很多包含“AFX”的字符串,如函数名AfxGetApp(),常量名AFX_IDS_APP_TITLE,数据结构名AFX_MSGMAP_ENTRY等等。这些名称在WindowsAPI函数中是不存在的,它们是AFX开发小组遗留的痕迹,而MFC的基本框架正是建筑于这些东西之上,所以MFC多多少少保留了该开发小组的标志AFX。可见MFC封装了SDK(软件开发工具包)结构、功能及应用程序框架内部技术。该应用程序框架隐藏过去Windows程序员
12、不得不处理的许多重复性工作。235.2.3MFC的设计原理MFC向软件开发者提供一组服务,来协调应用程序。在很多情况下,MFC在幕后执行一系列复杂的操作,它向程序员提供了更加简单的编程界面,并可掩盖WindowsAPI的一些缺点(MFC类的许多成员函数,如MessageBox()中提供了缺省参数,这减轻了程序员编程的负担)。MFC采用面向对象的设计方法,将WindowsAPI中的相关部分组合到C+类或对象中。例如CWnd类封装了大部分有关窗口处理的API函数。作为编程人员,不必记忆大量API函数,需要作的只是实例化CWnd类的一个实例,并调用相应的成员函数即可。245.2.4MFC的目标建立M
13、FC库的目的是为了简化Windows应用程序的编制,MFC开发小组的工作是将此目的和程序设计原理结合起来。Microsoft在建立MFC库遵循了一些基本原则,也是他们的设计目标:(1)有效简化编写Windows应用程序的难度,使用C+创建Windows应用程序的过程容易和直观。(2)合并已有的Windows的模型和概念。25(3)确保类库有足够的扩展性,以便于加入Windows后续版本的特性和功能。(4)更容易使用WindowsAPI特性。同时采用WindowsAPI的概念、编程风格和函数名称。(5)用类来封装WindowsAPI和Windows对象,并按照API的指引完成工作。(6)更容易使
14、用一些强大、复杂功能的抽象概念,如ActiveX、数据库支持、打印等。265.2.5使用C+和MFC的好处类是面向对象程序设计的核心概念,程序中不仅可以使用自己建立的类,还可以使用系统所提供的类,一个好的类库可以大大减少编码的数量。MFC成功之处在于,它是一个类库、一个包罗计算机系统方方面面的类库、一个集MicroSoft各路软件高手之大成的类库。通过从MFC继承自己所需要的类,可以充分利用基类所具有的各种功能。MFC将类、类的继承、动态约束、类的关系和相互作用等应用程序概念封装起来,可以使开发者高效、轻松地建立Windows应用程序,而不受设备限制并且由事件进行驱动。MFC具有良好的通用性和
15、可移植性,它定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的工作就是通过VC所提供的各种工具来完成这个工作。275.3MFC的层次结构及其子类功能简介5.3.1MFC中类的层次结构5.3.2根类CObject5.3.3应用程序体系结构类5.3.4可视对象类5.3.5预定义的宏285.3.1MFC中类的层次结构MFC是一个包含了超过200个不同类的很庞大的类库。利用他们,开发者可以完成许多标准的Windows编程任务,并且可以在应用程序中加入许多复杂的特性。在设计思想上,MFC将面向对象的方法与事件驱动结合得很好,因此要理解庞大的MFC类库中的常用类的功能,要利用面向对象的思
16、想进行理解和分析。类的抽象性、封装性、继承性和多态度在你碰到的类中是如何体现的。它封装了窗口的哪些数据成员和方法,哪些类是从这个类中派生出来的,该类中可超载的虚函数都有哪些(只有搞清虚拟函数才能搞清多态性)。打开MSDN,选中窗口左半部分的“搜索”选项卡,在待搜索的编辑框中输入“hierarchychart”后按回车,MSDN就把MFC的层次结构图显示在窗口的右半部分。2930315.3.2根类CObjectCObject类是MFC的抽象基类(不能派生对象),是MFC中多数类和用户自定义类的根类,它为程序员提供了许多公共操作和基本服务。主要包括:对象的动态建立与删除、序列化(即串行化)的支持、
17、对象诊断输出、运行时信息以及集合类的兼容等。它的作用是,使得MFC以及基于MFC的应用程序更加稳固和易于调试。32 5.3.3应用程序体系结构类1消息映射类CCmdTarget该类是CObject的子类,是MFC类库中所有具有消息映射属性的基类,消息映射规定了当对象接到命令消息时,应调用哪一个函数对该消息进行处理。命令消息是来自菜单项、命令按钮和加速键的信息,由CCmdTarget派生出的主框架类包括CView、CWinApp、CDocument、CWnd和CFrameWnd都可处理命令消息。程序员若需要一个新类来处理消息时,可以从CCmdTarget派生出一个新类。一般程序员很少从CCmdT
18、arget类中直接派生出新类,而是从其子类CView、CWinApp来派生332窗口应用程序类CWinApp每一个使用MFC的应用程序只能包含一个从CWndApp派生的应用程序对象,当VC的其它全局对象被构造时,这个对象也同时被构造,当Windows调用WinMain()函数时,产生的对象已经有效了。从CWinApp实例化的应用程序对象是一个全局变量,在程序运行中该对象可以与其它对象相互协调。(1)访问CWinApp对象以及全局函数。AfxGetApp:获得一指向CWinApp对象的指针AfxGetResourceHandle:获得一应用程序资源的句柄。AfxGetAppName:获得一指针,
19、它指向一个包含应用程序名的字符串。相反,如果有一个指向CWinApp对象的指针,使用m_pszExename可以取得应用程序的名称。34(2)CWinApp的公共数据成员m_pszAppName:指定应用程序的名称。m_nCmdShow:指定窗口最初将如何显示。m_pMainWnd:指针,它指向一个应用程序的主窗口。(3)CWinApp的公共成员函数LoadCursor:调取光标资源。LoadStandardCursor:调取Windows预定义光标,在windows.h中指定IDC常量。LoadIcon:调取一个图标资源。LoadStandardIcon:调取Windows预定义的图标,在w
20、indows.h中指定IDI常量。OpenDocumentFile:框架调用此函数打开一个指定的文档。35(4)CWinApp的可重载的函数InitApplication:重载以执行任何应用程序层次上的初始化。InitInstance:重载以执行Windows对象实例的初始化,诸如建立用户窗口对象等。Run:运行缺省的消息循环,重载该函数以自定义消息循环。OnIdle:重载以执行任何应用程序指定的空闲时间处理。PreTranslateMessage:在窗口消息被TranslateMessage()和DispatchMessage()处理之前过滤它们。(5)CWinApp的保护成员函数SetDi
21、alogBkColor:为对话框和消息框设置缺省的背景颜色。Enable3dConrtols:允许具有三维外观的控件。363应用程序线程类CWinThread该类为线程的基类,CWinApp是从CWinThread派生而来。该对象描述程序线程的执行,主线程的执行通常由一个CWinApp的派生对象提供。(1)CWinThread的公共数据成员m_hThread:当前线程的句柄。m_nThreadID:当前线程的ID值。m_pMainWnd:指向程序主窗口指针。(2)CWinThread的公共成员函数GetMainWnd:获取一个指向此线程的的主窗口指针。GetThreadPriority:获取当
22、前线程的优先权。ResumeThread:减小一个线程的挂起计数。374.文档/视图类文档对象由文档模板对象创建,管理应用程序的数据。视图对象表示一个窗口的客户区,它显示文档数据并允许用户与之交互。CDocTemplate类:文档模板的基类。它负责协调文档、视窗和框架窗口的创建。CMultiDocTemplate类:多文档界面(MDI)的文档模板。CSingleDocTemplate类:单文档界面(SDI)的文档模板。CDocument:应用程序所用文档的基类。CView:显示文档数据的应用程序专用视图的基类。385.3.4可视对象类1.窗口类CWndCWnd类提供了MFC中所有窗口类的基类。
23、CWnd与Windows窗口有所不同,但他们又是紧密相连的。CWnd对象是由CWnd的构造函数和析构函数建立和取消的,而Windows窗口与此不同,它是Windows的一个结构,是由create成员函数建立的,DestroyWindow函数破坏Windows窗口而不是破坏对象。(1)CWnd类的公共数据成员m_hWnd:标识连接到该CWnd对象上的HWND。(2)CWnd类的初始化函数Create:创建并初始化与该CWnd对象相联系的子窗口。PreCreateWindow:在建立连接到这个CWnd对象的Windows窗口之前调用此函数。39GetStyle:返回当前窗口的风格。Subclass
24、Window:将一个窗口连接给一个CWnd对象并使其通过该CWnd的消息映射传递消息。FromHandle:给出一个窗口句柄时,返回一个CWnd对象的指针。GetSafeHand:返回m_hWnd;若此指针为NULL,则返回NULL。(3)CWnd类的窗口状态函数EnableWindow:允许或禁止鼠标和键盘输入。GetActiveWindow:获取活动的窗口。SetActiveWindow:激活窗口。SetFocus:要求输入焦点。GetFocus:获取当前具有输入焦点的CWnd。40(4)窗口的大小和位置函数GetWindowPlacement:获取一个窗口显示状态及正常、最小化的和最大化
25、的窗口位置SetWindowPlacement:设置一个窗口显示状态及正常、最小化的和最大化的窗口位置。MoveWindow:改变CWnd的位置和大小。SetWindowPos:改变子窗口、弹出式窗口和顶层窗口的大小、位置和次序。GetWindowRect:获取CWnd的屏幕坐标。GetClientRect:获取CWnd客户区的大小。41(5)访问窗口函数FindWindow:返回由窗口类和窗口名标识的窗口句柄。GetTopWindow:返回属于CWnd的第一个子窗口。GetParent:获取CWnd的父窗口。GetDlgItem:由指定的对话框获取具有指定ID的控件。GetDescendan
26、tWindow:查询所有的派生窗口,并返回具有指定ID的窗口。CenterWindow:将一窗口相对于其父窗口中心定位。42(6)更新/绘制函数GetDC:获取一个客户区的设备描述表(DeviceContext)。GetWindowDC:获取整个窗口的,包括标题栏,菜单和滚动条的设备描述表。ReleaseDC:释放客户区和窗口的设备描述表。Invalidate:使整个客户区无效。ShowWindow:显示或隐藏窗口。(7)窗口文本函数SetWindowText:将窗口的标题设置为指定的文本。GetWindowText:返回窗口的标题。SetFont:设置当前的字体。GetFont:获取当前的字
27、体。43(8)滚动函数GetScrollPos:获取滚动条的当前位置。ScrollWindow:卷滚客户区的内容。SetScrollPos:设置一个滚动框的当前位置,若指定新位置,则重画滚动条。(9)菜单函数GetMen:获取指向指定菜单的指针。SetMenu:将菜单设置为指定的菜单。HiliteMenuItem:在一顶层菜单上高亮度显示或除去高亮度显示。(10)剪贴板函数OpenClipboard:打开剪贴板。GetClipboardOwner:获取指向剪贴板的当前拥有者的指针。GetOpenCilpboardWindow:获取指向当前剪贴板窗口的指针。442CFrameWnd类(1)CFr
28、ameWnd:SDI应用程序的主框架窗口的基类,它是其它框架窗口类的基类。(2)CMDIFrameWnd:MDI应用程序的主框架窗口的基类。(3)CMDIChildWnd:MDI应用程序的文档框架窗口的基类。3视图类(1)CView:查看文档数据的应用程序视图的基类。(2)CScrollView:具有滚动功能的视图的基类。从其派生的视图类可以自动实现滚动。(3)CFormView:从其派生的类用于实现基于对话模板资源的用户界面。(4)CRecordView:提供直接链接到ODBC记录集的表单视图。(5)CEditView:包含Windows标准编辑控件的视图。454对话框类由于对话框是一个特殊
29、窗口,所以该类是从CWnd类中派生出来的。对话框子层次结构包括通用对话框类CDialog以及支持字体选择、打印、替换文本等公共对话框子类。(1)CDialog:所有对话框(模态或者非模态)的基类。(2)CCommonDialog:所有通用对话框类的基类。(3)CFileDialog:打开或保存文件的标准对话框。(4)CColorDialog:用于选择颜色的的标准对话框。(5)CFontDialog:选择字体的标准对话框。(6)CPrintDialog:用于打印文件的标准对话框。465控件类控件子层次包含若干个可视控件,使用这些类可建立静态文本、命令按钮、位图按钮、列表框、组合框、滚动条和编辑框
30、等,这些可视控件为Windows应用程序提供了各种输入和显示界面。(1)CStatic:静态文本控件窗口。用于标注、分隔对话框和窗口中的其他控件。(2)CButton:按钮控件窗口。该类为对话框或窗口中的按钮、检查框或单选按钮提供一个总的接口。(3)CEdit:编辑控件窗口。编辑控制用于接收用户的文字输入。(4)CScrollBar:滚动条控件窗口。该类提供控制条的功能,用做对话框或窗口中的一个控件,可通过它在某一范围内定位。47(5)CSliderCtrl:滑动条控件窗口,包含一个可移动的滑标,用户可以移动滑标选择一个值或一个范围。(6)CListBox:列表框控件窗口。列表框用于显示一组列
31、表项,用户可以进行观察和选择。(7)CComboBoxl:组合框控件窗口,它由一个编辑控制和一个列表框组成。(8)CBitmapButton:以位图而非文字作为标题的按钮。(9)CAnimateCtrl:动画显示控件,以Windows标准视频/音频格式显示AVI剪辑。(10)CTreeCtrl:树形查看控件,显示项的层次列表结构。(11)CListCtrl:管理由图标和标签组成的列表项,可以4种方式(图标、小图标、列表和详细资料)显示列表项内容。486.控件栏类控件栏类为工具条、状态条、对话条和分割窗口建立模型,它负责管理工具条、状态条、对话条的一些成员函数。控制条指的是连接在窗口框架顶部或底
32、部的小窗口。(1)CControlBox:MFC控件栏的基类。(2)CToolBar:包含位图按钮的工具栏控件窗口。(3)CStatusBar:状态栏控件窗口的基类。(4)CDialogBar:基于对话框模板资源的控件栏。(5)CStatusBarCtrl:分成多个面板的水平窗口,用于显示应用程序和状态信息。(6)CToolBarCtrl:Windows工具栏控件,包含按钮和可选空间的窗口。495.3.5预定义的宏Windows库中包含了大量支持CObject类及其子类的宏,下面一一讲解。1消息映射宏Windows是一个消息驱动的操作系统,VC提供了与消息有关的宏,它们是:(1)DECLARE
33、_MESSAGE_MAP(初始化消息映射表);(2)BEGIN_MESSAGE_MAP(开始用户消息映射);(3)END_MESSAGE_MAP(结束用户消息映射)。502确定对象所属类的信息的宏每一个从CObject派生的类都和一个对应的CRuntimeClass结构相联系,在程序运行时,用户可以根据该结构掌握对象的信息以及该类的基类的信息。另外,通过CObject中的成员函数IsKindOf可确定某对象是否属于一个指定的类或由指定的类派生。为了使从CObject派生的类的对象能够在程序运行时动态创建,VC汇总提供了动态创建对象的宏,它们是:(1)DECLARE_DYNCREATE(放在类的
34、声明文件中,声明动态创建对象);(2)IMPLEMENT_DYNCREATE(放在类的实现文件中,表明实现对象的动态创建)。513实时运行类结构信息宏该宏的结构是RUNTIME_CLASS(),在应用程序使用该宏,可以在运行时由类“名称”获得有关类结构的信息。方法为通过CObject的成员函数IsKindOf()来确定。52串行化宏从一个文件中读出或向某一文件中写入某对象的过程叫串行化。若想使从CObject派生的类可串行化,应该按下列步骤使用宏:(1)在从CObject派生的类的定义中使用DECLARE_SERIAL宏;(2)在从CObject派生的类的实现文件中使用IMPLEMENT_SE
35、RIAL宏;(3)在从CObject派生类中重载Serialize成员函数。MFC中还包含了许多完成其它功能的宏,如:可用于诊断服务、异常处理、应用信息与管理等,可参阅MSDN的说明。535.4MFC应用程序架构5.4.1应用程序架构的概念5.4.2软件复用5.4.3使用应用程序架构的好处5.4.4一个基于框架的MFC应用程序5.4.5VC程序ClassView的使用方法545.4.1应用程序架构的概念应用程序架构就是在特定的领域中程序之间的共同结构,它是某领域中的程序员,依照共同结构来开发程序,使得程序之间具有一致性,增加了程序的清晰度,以此来降低程序的设计和维护费用。从应用方面讲,架构就是
36、整个或部分系统的可复用设计,表现为一组抽象组件及其实例间交互的方法;从目的方面讲架构就是可被应用程序开发者定制的应用骨架。可以说,一个应用程序架构就是一个可复用的设计组件。它规定了应用程序的体系结构,阐明了整个设计、协作组件之间的依赖关系、责任分配和控制流程。应用程序架构包括应用程序的总体组织和全局控制、通讯协议、同步、数据存取,给设计元素分配特定功能,设计元素的组织,规模和性能,以及在各个设计方案间进行选择。MFC就是一种应用程序架构。555.4.2软件复用软件复用是指在两次或多次不同的软件开发过程中重复使用相同或相近软件元素的过程。软件元素包括程序代码、测试用例、设计文档、设计过程、需求分
37、析文档甚至领域知识。通常,把这种可复用的元素称作软构件,可复用的软件元素越大,复用的粒度越大。不管是多大粒度的复用,它们都是软件复用。根据复用的程度,可以将软件复用分为以下几类:(1)源代码复用。该方式是应用最为广泛的复用方式,它不仅表现在复用现有的代码,例如已经开发完的类、源文件、LIB库,还表现在每一代码的实现过程中。(2)模块复用。典型的例子是Windows下的动态链接库程序DLL当前模块复用比较活跃的技术有COM组件技术,每个COM组件有自己的属性和操作,是一个相对独立运行的实体,使用该技术构造应用程序就像是搭积木一样,搞清楚每个程序这个“建筑”有哪些积木块组成。56(3)接口复用。在
38、一个程序定义好一套接口,而另一个应用程序可以依据这套接口来详细设计,接口复用在VC下表现为一些类的虚函数。微软的VisualStudio的IDE编程、IE扩展编程、屏幕保护程序等都是接口复用的例子。接口的定义使得软件的开发可以扩展到用户一级,由用户进行软件功能的深化或定制。(4)应用程序复用。在一个应用程序中调用另一个程序,创建一个新的进程就是应用程序复用的典型例子。在Win32平台下,一般通过CreateProcess这个API函数和SHELL方面的API函数ShellExecute来创建新的进程。(5)应用程序架构复用。MFC就是实现了一种应用程序架构复用的类库。575.4.3使用应用程序
39、架构的好处应用程序架构本质上是一种软件高层次复用,它可以在具有相似需求的多个系统中得到复用,这比代码级的复用具有更大的意义。通过对应用程序架构抽象可以使设计者能够对一些经过时间证明是非常有效的体系结构进行复用,从而保证新的软件开发能够成功,提高软件开发的效率。在软件设计过程中,我们常常会发现,对一个体系结构部件进行抽象就可以将它应用到其它的设计中,从而降低设计的复杂度。应用程序架构有利于形成完整的软件生产线和软件工厂,并共享公共的架构,应用程序架构的可复用性使得我们可以使用第三方应用程序架构。585.4.4一个基于框架的MFC应用程序【例5-1】利用MFC编写基于框架结构的应用程序。1生成程序
40、框架在VC的集成开发环境下选择“File|New.”,并在“Projects”选项卡中选择“Win32Application”,在项目名称ProjectName编辑框中输入“MfcHello”,路径Location编辑框中输入一个工程所存放的路径(如e:vcpp)后,单击“OK”按钮后,出现“Win32Application-Step1of1”对话框。选择生成一个空工程后(AnEmptyproject)并按下“Finish”按钮。592在工程MfcHello添加hello.h头文件再次使用“File|New.”,并在“Files”选项卡中选择“C/C+HeaderFile”,在文件名File编
41、辑框中输入“Hello”,路径Location使用缺省路径,完后按“OK”按钮,就在当前的工程MfcHello中添加了一个头文件hello.h。编辑该头文件的内容如下:class CMyApp:public CWinApp public:virtual BOOL InitInstance();/重载的虚函数 ;class CMainWindow:public CFrameWnd public:CMainWindow();/构造函数 protected:afx_msg void OnPaint();/WM_PAINT的消息响应函数 DECLARE_MESSAGE_MAP()/声明消息映射;603
42、在工程MfcHello添加实现文件hello.cpp再次使用“File|New.”,并在“Files”选项卡中选择“C+SourceFile”,在文件名File编辑框中输入“Hello”,路径Location使用缺省路径,完后按“OK”按钮,就在当前的工程MfcHello中添加了一个C+实现文件hello.cpp。编辑该实现文件的内容如下:#include#include Hello.h CMyApp TheApp;/由应用程序类实例化一个对象 BOOL CMyApp:InitInstance()m_pMainWnd=new CMainWindow;/m_pMainWnd是CMyApp的公有数
43、据成员,它从类CWinApp继承而来,存放主窗口的指针 m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;61BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)/开始消息映射 ON_WM_PAINT()END_MESSAGE_MAP()/结束消息映射CMainWindow:CMainWindow()/框架窗口的构造函数 Create(NULL,The First MFC Application);/创建窗口void CMainWindow:OnPaint()CPaintD
44、C dc(this);CRect rect;GetClientRect(&rect);dc.DrawText(您好!,这是利用MFC开发的第一个程序,-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);624设置动态链接到MFC类库在VC的集成开发环境下选择“Project|Setting.”,弹出“ProjectSetting”对话框。在该对话框左方的“General”选项卡中通过组合框“MicrosoftFoundationClass”选择使用MFC类库的方法为“UseMFCinaSharedDLL(以动态链接库方式使用MFC)”,该种方式依赖于Win
45、dows操作系统目录下存放的mfc*.dll库文件。选项“NotUsingMFC”代表程序中不使用MFC,“UseMFCinaStaticDLL”代表以静态方式链接到MFC,该方式的优点是程序的运行不依赖mfc*.dll文件,但它的代价是可执行文件的长度大,而且对内存的利用不够充分。5运行程序编译、链接并运行该程序,在屏幕上出现了一个显示信息的具有Windows界面的窗口。它具有可以移动、最大化、最小化等常见的窗口功能。63645.4.5VC程序ClassView的使用方法WorkSpace窗口中的ClassView栏用来显示应用程序中所有类的信息。若在VC中打开的工程名为DialogExam
46、,单击WorkSpace窗口底部的ClassView选项后,则显示一个标题为“DialogExamClasses”。在ClassView中的任何标题或图标处单击鼠标右键,均可弹出快捷菜单,用于完成当前状态下的一些常用操作。65应用程序的快捷菜单在ClassView窗口的最顶层名称或图标处(即Projectresource层)单击鼠标右键,可弹出如右图所示的快捷菜单。菜单中的主要功能见下表菜菜单项功能功能Set Active Projiect将该工程设置为当前工程(当一个工作区包含多个工程时有效)New Class向应用程序中增加新的类New ATL Object向应用程序中增加ATL(活动模板
47、库)对象New Folder在ClassView中创建一个新的目录,可将ClassView中的类移入到该目录中,便于管理Docking View在船坞化窗口和浮动式窗口之间转换该窗口的显示状态Hide隐藏WorkSpace窗口Properities打开工程的属性窗口,无实际信息66类的快捷菜单单击其前面的符号“+”或双击图标,DialogExam工程中的所有的类都被显示,如CAboutDlg类、CMainFram类、CDialogExamApp类、CDialogExamApp类、CDialogExamView类、CDialogExamDoc类等。在类上右键单击,可弹出快捷菜单菜菜单项功能功能G
48、o to Defination打开类的定义文件(.h)Add Member Function向类中添加成员函数Add Member Variable向类中添加成员变量Add Virtual Function向类中重载虚成员函数Add Windows Message Handler向类中添加消息句柄Reference找到引用该类的语句Derived Classes查看类及派生类的的成员函数和成员变量Base Classes查看类及基类的的成员函数和成员变量Add to Gallery加入到VC6.0的组件库,以便在其它程序和模块中使用New Folder同前面的Properties打开类的属性窗
49、口,显示类的有关信息,如基类等67成员函数及成员变量的快捷菜单单击类视图中各个类的“+”,则会显示该类中的成员函数和成员变量,右键单击后,会显示如图所示快捷菜单。双击成员函数名前的图标,则可直接打开实现代码文件并显示相应函数体部分以供用户编辑。68成员函数及成员变量的快捷菜单内容菜单项功能Go to Defination打开将函数的实现文件(.cpp)并显示该函数的函数体Go to Declaraton打开将函数的定义文件(.h)并显示该函数的定义Set Breakpoint在函数中设置调试断点Reference找引用该函数的语句Calls显示该函数的函数体、原型说明和调用所在之处Called By显示应用程序调用该函数之处Properities打开函数的属性窗口,查看有关信息,如入口参数菜单项功能Go to Defination打开类的定义文件(.h)并显示该变量在类中的定义References查看应用程序中引用该变量的语句New Folder向应用程序中增加ATL(活动模板库)对象Properities打开变量的属性窗口,查看有关信息,如变量类型69从MFC示例开始利用类向导,生成一个名为MfcExam的标准MFC多文档工程70类视图类视图71资源视图资源视图72文件视图文件视图7374757677787980谢谢 谢谢!
限制150内