教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 综合文档 >

基于Opengl的屏幕对象拾取 毕业论文(3)

来源:网络收集 时间:2026-08-10
导读: 分述如下: (1)对Win32应用程序编程接口的封装; (2)对应用程序概念的封装; (3)对COM/OLE特性的封装; (4)对ODBC功能的封装。 2.4.2继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类

分述如下:

(1)对Win32应用程序编程接口的封装; (2)对应用程序概念的封装; (3)对COM/OLE特性的封装; (4)对ODBC功能的封装。 2.4.2继承

首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是CObject和CCmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。

针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CwinThread;文档对象,基类是Cdocument,等等。 2.4.3虚拟函数和动态约束

MFC以“C++”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 2.5 应用程序的构成

图2解释了该应用程序的结构与对象,箭头表示信息流向。

图 2 应用程序的结构

从CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd类对应地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五个类,这五个类的实例分别是应用程序对象、文档对象、视对象、主框架窗口对象和文档边框窗口对象。主框架窗口包含了视窗口、工具条和状态栏。对这些

8

类或者对象解释如下:

(1)应用程序(CWinApp)

应用程序类派生于CWinApp。基于框架的应用程序必须有且只有一个应用程序对象,它负责应用程序的初始化、运行和结束。 (2)边框窗口(CMDIFrameWnd)

如果是SDI应用程序,从CFrameWnd类派生边框窗口类,边框窗口的客户子窗口(MDIClient)直接包含视窗口;如果是MDI应用程序,从CMDIFrameWnd类派生边框窗口类,边框窗口的客户子窗口(MDIClient)直接包含文档边框窗口。如果要支持工具条、状态栏,则派生的边框窗口类还要添加CToolBar和CStatusBar类型的成员变量,以及在一个OnCreate消息处理函数中初始化这两个控制窗口。

边框窗口用来管理文档边框窗口、视窗口、工具条、菜单、加速键等,协调半模式状态(如上下文的帮助(SHIFT+F1模式)和打印预览)。 (3)文档边框窗口(CMDIChildWnd)

文档边框窗口类从CMDIChildWnd类派生,MDI应用程序使用文档边框窗口来包含视窗口。 (4)文档(CDocument)

文档类从CDocument类派生,用来管理数据,数据的变化、存取都是通过文档实现的。视窗口通过文档对象来访问和更新数据。 (5)视(CView)

视类从CView或它的派生类派生。视和文档联系在一起,在文档和用户之间起中介作用,即视在屏幕上显示文档的内容,并把用户输入转换成对文档的操作。

用图的形式可直观地表示所涉及的MFC类的继承或者派生关系,如下:

图 3 MFC的层次

2.6 基于OpenGL+MFC的三维模拟的编程环境配置

用MFC调用OpenGL函数来进行三维模拟的编程环境配置: (一)创建MFC项目

(1) 创建项目文件:选择File/New 菜单选项,建立一个名为MyTest 的单文档 (SDI) 应用程序; (二)配置OpenGL开发环境

(1)将91.h,glu.h,glaux.h和glut.h拷贝到???(即盘符+路径)\Microsoft Visual Studio\VC98\Include\GL目录中; (2)将opengl32.1ib,glu32.1ib,glaux.1ib和glut32.1ib拷贝到???(即盘符+路径)\Microsoft

9

Visual Studio\Vc98\Lib目录中;

(3)将opengl32.dll,glu.dll,glu32.dll,glut.dll,glut32.dll文件拷贝到操作系统安装目录C:\WINDOWS\system32目录下;

(4)选择Project/Setting 菜单选项。在Link栏的Lib输入域中添加openg132.lib、glu32.lib,若需使用OpenGL的辅助库函数,则还需添加glaux.lib。 到此,基于OpenGL+MFC的开发环境就建立好。 (三)初始化OpenGL 具体编程步骤:

第一步:修改窗口风格设置。 需要在函数CGLView::PreCreateWindow中增加对Windows窗口风格的设置,以防止在窗口重叠时把图形绘制到子窗口和兄弟窗口。实现代码如下:cs.style l=WS_CLIPCHILDREN WS CLIPSIBLINGS; 第二步:设置像素格式。

首先需要在视图类CGLView中添加一个成员函数,函数原型如下:BOOL CGLView::SetupPixelFormat(CDC*pDC);设置像素格式并向视图类CGLView中添加两个成员变量:

CDC* m_pDC;OpenGL设备场境HGLRC m_hRC;OpenGL渲染场境在Windows中,使用结构PIXELFO腿ATDEscRIPTOR来设置像素格式,并提供ChoosePixelFormat()函数来选择最为匹配的像素格式以及SetPixelFormat()函数来为设备场境设置像素格式。 设置像素格式的步骤如下:

a.填写结构PIXELFORMATDESCRIPTOR,像素格式是用这个结构来描述的。

b.调用函数ChoosePixelFormat(),将填写好的像素格式结构传递给该函数,函数ChoosePixelFormat()返回一个整型的序号。这个序号标识一个当前设备场境中所能提供的,且与所要求的像素格式最为匹配的像素格式。

c.将这个返回的像素格式序号传递给函数SetPixelFormat(),使之设置成为当前设备场境的像素格式。

第三步:创建渲染场境。

用wglreatecontext()函数来创建OpenGL的一个渲染场境;用wglMakeCurrent()函数使给定的渲染场境设置成为当前调用线程的渲染场境,而线程中随后调用的OpenGL命令都将通过与该渲染场境相关联的设备场境来实现窗口的场景绘制。具体实现代码如下: HDC m hDC;

HGLRC nl hglRC:

m_hglRC=wglCreateContext(m_hDC);创建一个渲染场境

wglMakecurrent(m_hDC,m hglRC);使成为当前调用线程的渲染场境 第四步:添加消息处理函数。

利用MFC ClassWizard为CGLView类添加消息:帐_CREATE、wM_DESTROY、m,t_SIZE和删_TIMER的响应函数,消息处理函数名依次为:OnCreate()、onDestroy()、OnSize()和OnTimer()。 A.CGLView::OnCreate()函数

该函数完成的功能是:在视图窗口创建完成后,进行OpenGLWindows的初始化工作。 (四)清理工作 CGLView::OnDestroy()函数

该函数完成的功能是:在视图窗口被释放时,用于清除当前的渲染场境,并释放设备场境。具体实现代码如下:

wglMakeCurrent(NULL,NULL);

wglDeleteContext(m__hglRC);清除渲染场境: ReleaseDC(m_hWnd,m_hDC);释放设备场境

10

C.CGLView::OnSize()函数 D.CGLView::OnTimer()函数

该函数完成的功能是:通过定时器每隔一定时间的消息驱动,来实现动态的场景更新。

11

3 拾取技术

< …… 此处隐藏:3358字,全部文档内容请下载后查看。喜欢就下载吧 ……
基于Opengl的屏幕对象拾取 毕业论文(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/403874.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)