3d飞行训练系统的设计与实现_毕业论文(编辑修改稿)内容摘要:

可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard 用来协助添加代码到框架文件;最后编译,则通过类库实现了应用程序特定的逻辑。 的特点 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立 Windows 下的应用程序,这是一种相对 SDK 来说更为简单的方法。 因为总体上, MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。 Microsoft Visual C++提供了相应的工具来完成这个工作: AppWizard 可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口; ClassWizard 用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。 封装 构成 MFC 框架的是 MFC 类库。 MFC 类库是 C++类库。 这些类或者封装了 Win32 应用程序编程接口,或者封装了应用程序的概念,或者封装了 OLE 特性,或者封装了 ODBC 和 DAO 数据访问的功能,等等,分述如下。 ( 1)对 Win32 应用程序编程接口的封装 用一个 C++ Object 来包装一个 Windows Object。 例如: class CWnd 是一个 C++ window object,它把 Windows window(HWND)和 Windows window 有关的 API 函数封装在 C++ window object 的成员函数内,后者的成员变量 m_hWnd 就是前者的窗口句柄。 ( 2)对应用程序概念的封装 使用 SDK 编写 Windows 应用程序时,总要定义窗口过程,登记 Windows Class,创建窗口,等等。 MFC 把许多类似的处理封装起来,替程序员完成这些工作。 另外, MFC 提出了以文档 视图为中心的编程模式, MFC 类库封装了对它的支持。 文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。 ( 3)对 COM/OLE 特性的封装 OLE 建立在 COM 模型之上,由于支持 OLE 的应用程序必须实现一系列的接口( Interface),因而相当繁琐。 MFC 的 OLE 类封装了 OLE API 大量的复杂工作,这些类提供了实现 OLE 的更高级接口。 ( 4)对 ODBC 功能的封装 以少量的能提供与 ODBC 之间更高级接口的 C++类,封装了 ODBC API 的大量的复杂的工作,提供了一种数据库编程模式。 继承 首先, MFC 抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。 这些类中,最重要的类是 CObject 和 CCmdTarget。 CObject 是 MFC 的根类,绝大多数 MFC 类是其派生的,包括CCmdTarget。 CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。 所有从 CObject 派生的类都将具备或者可以具备 CObject 所拥有的特性。 CCmdTarget 通过封装一些属性和方法,提供了消息处理的架构。 MFC 中,任何可以处理消息的类都从 CCmdTarget 派生。 针对每种不同的对象, MFC 都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。 这些对象包括以下种类:窗口对象,基类是 CWnd;应用程序对象,基类是 CwinThread;文档对象 ,基类是 Cdocument,等等。 程序员将结合自己的实际,从适当的 MFC 类中派生出自己的类,实现特定的功能,达到自己的编程目的。 虚拟函数和动态约束 论文) 8 MFC 以“ C++”为基础,自然支持虚拟函数和动态约束。 但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。 例如, CWnd 封装 Windows 窗口对象时,每一条 Windows 消息对应一个成员函数,这些成员函数为派生类所继承。 如果这些函数都设计成虚拟函数,由于数量太多,实现起 来不现实。 于是, MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射, MFC 类提供了丰富的编程接口。 程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入 MFC 的编程框架。 MFC 编程框架将在适当的时候、适当的地方来调用程序的代码。 本书将充分的展示 MFC 调用虚拟函数和消息处理函数的内幕,让读者对 MFC的编程接口有清晰的理解。 MFC 的编程框架 MFC 的宏观框架体系 MFC 实现了对应用程序概念的封装,把类、类的继承、 动态约束、类的关系和相互作用等封装起来。 这样封装的结果对程序员来说,是一套开发模板(或者说模式)。 针对不同的应用和目的,程序员采用不同的模板。 例如, SDI 应用程序的模板, MDI 应用程序的模板,规则 DLL 应用程序的模板,扩展 DLL 应用程序的模板, OLE/ACTIVEX 应用程序的模板,等等。 这些模板都采用了以文档 视为中心的思想,每一个模板都包含一组特定的类。 典型的 MDI 应用程序的构成将在下一节具体讨论。 为了支持对应用程序概念的封装, MFC 内部必须作大量的工作。 例如,为了实现消息映射机制,MFC 编程框架 必须要保证首先得到消息,然后按既定的方法进行处理。 又如,为了实现对 DLL 编程的支持和多线程编程的支持, MFC 内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。 虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解 MFC 内部机制有助于写出功能灵活而强大的程序。 总之, MFC 封装了 Win32 API, OLE API, ODBC API 等底层函数的功能,并提供更高一层的接口,简化了 Windows 编程。 同时, MFC 支持对底层 API 的直接调用。 MFC 提供了一个 Windows 应用程序开发模式,对 程序的控制主要是由 MFC 框架完成的,而且 MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。 框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。 MFC 是 C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。 例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。 实现这种功能的基础是 C++对继承的支持,对虚拟函数的支持,以及 MFC 实现的消息映射机制。 应用程序构成 用 AppWizard 产生一个 MDI 工 程 t(无 OLE 等支持), AppWizard 创建了一系列文件,构成了一个应用程序框架。 这些文件分四类:头文件( .h),实现文件 (.cpp),资源文件 (.rc),模块定义文件 (.def),等。 构成应用程序对象 下图解释了该应用程序的结构,箭头表示信息流向。 论文) 9 图 应用程序的结构 从 CWinApp、 CDocument、 CView、 CMDIFrameWnd、 CMDIChildWnd 类对应地派生出 CTApp、 CTDoc、 CTView、CMainFrame、 CChildFrame 五个类,这五个类 的实例分别是应用程序对象、文档对象、视对象、主框架窗口对象和文档边框窗口对象。 主框架窗口包含了视窗口、工具条和状态栏。 对这些类或者对象解释如下。 ( 1)应用程序 应用程序类派生于 CWinApp。 基于框架的应用程序必须有且只有一个应用程序对象,它负责应用程序的初始化、运行和结束。 ( 2)边框窗口 类 如果是 SDI 应用程序,从 CFrameWnd 类派生边框窗口类,边框窗口的客户子窗口 (MDIClient)直接包含视窗口;如果是 MDI 应用程序,从 CMDIFrameWnd 类派生边框窗口类,边框窗口的客户子窗口 (MDIClient)直接包含文档边框窗口。 如果要支持工具条、状态栏,则派生的边框窗口类还要添加 CToolBar 和 CStatusBar 类型的成员变量,以及在一个 OnCreate 消息处理函数中初始化这两个控制窗口。 边框窗口用来管理文档边框窗口、视窗口、工具条、菜单、加速键等,协调半模式状态(如上下文的帮助 (SHIFT+F1 模式 )和打印预览)。 ( 3)文档边框窗口 类 文档边框窗口类从 CMDIChildWnd 类派生, MDI 应用程序使用文档边框窗口来包含视窗口。 ( 4)文档 类 文档类从 CDocument 类派生,用来管理数据,数据的变化、存取都是通过文档实现的。 视窗口通过文档对象来访问和更新数据。 ( 5)视 类 视类从 CView 或它的派生类派生。 视和文档联系在一起,在文档和用户之间起中介作用,即视在屏幕上显示文档的内容,并把用户输入转换成对文档的操作。 ( 6)文档模板 类 文档模板类一般不需要派生。 MDI 应用程序使用多文档模板类 CMultiDocTemplate; SDI 应用程序使用单文档模板类 CSingleDocTemplate。 应用程序通过文档模板类对象来管理上述对象(应用程序对象、文档对象、主 边框窗口对象、论文) 10 文档边框窗口对象、视对象)的创建。 构成应用程序的对象之间的关系 图 MFC 类的继承和派生关系用图的形式可直观地表示所涉及的 MFC 类的继承或者派生关系,如图所示意。 图所示的类都是从 CObject 类派生出来的;所有处理消息的类都是从 CCmdTarget 类派生的。 如果是多文档应用程序,文档模板使用 CMultiDocTemplae,主框架窗口从 CMdiFarmeWnd 派生,它包含工具条、状态栏和文档框架窗口。 文档框架窗口从 CMdiChildWnd 派生,文档框架窗口包含视 ,视从 CView 或其派生类派生。 构成应用程序的文件 通过上述分析,可知 AppWizard 产生的 MDI 框架程序的内容,所定义和实现的类。 下面,从文件的角度来考察 AppWizard 生成了源码和作用。 表 列出了 AppWizard 所生成的头文件,表 列出了了 AppWizard 所生成的实现文件及其对头文件的包含关系。 表 AppWizard 所生成的头文件 头文件 用途 标准 AFX 头文件 resource.h 定义了各种资源 ID include定义了从 CWinApp 派生的应用程序对象 CTApp childfrm.h 定义了从 CMDIChildWnd 派生的文档框架窗口对象 CTChildFrame 定义了从 CMDIFrameWnd 派生的框架窗口对象 CMainFrame 定义了从 CDocument 派生的文档对象 CTDoc 论文) 11 定义了从 CView 派生的视图对象 CTView 表 AppWizard 所生成的实现文件 从表 中的包含关系一栏可以看出: CTApp 的实现用到所有的用户定义对象,包含了他们的定义; CView 的实现用到 CTdoc;其他对象的实现只涉及自己的定义; 当然,如果增加其他操作,引用其他对象,则要包含相应的类的定义文件。 基于 OpenGL+MFC 的三维模拟的编程环境配置 1.创建 MFC 项目 ①创建项目文件。 选择 File|New 菜单项,新建一个基于对话框的项目文件 MyDlgOpenGL; ② 修改对话框模板。 删除对话框中的静态文本,调整控件的位置; ③添加 OpenGL 开发 库文件到项目 在编译程序的时候选择 Project|Setting 菜单,在 Link 标签中的 Object/library modules 编辑框中输入“ , , , ”; ④创建新类,添加消息映射。 选择 View|ClassWizard 菜单项 ,打开MFC对话框,在 Add Class之中选择 New,以便添加一个新类 COpenGL,且该类的基类选择 generic CWnd;最后利用 MFC ClassWizard 为 COpenGL 类添加消息 WM_CREATE, WM_PAINT 的映射。 实现文件 所包含的头文件 实现的内容和功能 include 用来产生预编译的类型信息。 include include include include include include 定义 CTApp 的实现,并定义 CTApp 类型的全局变量 theApp。 include include include 实现了类 CChildFrame include include include 实现了类 CMainFrame include include include 实现了类 CTDoc include include include include 实现了类 CTview 论。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。