欢迎来到天天文库
浏览记录
ID:5264093
大小:786.15 KB
页数:5页
时间:2017-12-07
《vc环境下opengl多视图窗口的实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、软件报/2006年/10月/23日/第019版开发编程应用实例VC环境下OpenGL多视图窗口的实现编程语言:VisualC++6.0重庆龚勋摘要:本文在VisualC++环境下,以4个OpenGL窗口为例,介绍多个OpenGL窗口的实现,在此框架的基础上,可以实现类似3DSMax多视角3D软件编程。关键字:OpenGL;三维;多视角;多视图;OpenGL是在SGI等多家世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通用共享的开放式三维图形标准。很多著名的产品包括动画制作软件SoftImage和3DS
2、tudioMAX等都是在它的基础上实现的。从本质上说,OpenGL是一个完全可移植并且速度很快的3D图形和建模库。在Windows平台上,OpenGL可以方便地与VisualC++(在下文中简称VC)结合,创建精致漂亮的3D图形。通常在VC环境下编写OpenGL程序都是单视图的模式,本文介绍如何把单个视图拆分为多个,如何在各个视图上进行切换绘图。1.OpenGL绘图1.1.OpenGL绘图简介具有Windows编程经验的人都知道,在Windows下用GDI绘图必须通过设备上下文(DeviceContext简称DC)调用相应的
3、绘图函数;用OpenGL绘图也是类似,OpenGL函数也通过“渲染上下文”(RenderingContext简称RC)完成三维图形的绘制。正如设备上下文DC要存储GDI的绘制环境信息如笔、刷和字体等,渲染上下文RC也必须存储OpenGL所需的渲染信息如像素格式等。DC调用每个GDI函数都需要一个DC句柄,而RC不同,所有的OpenGL函数都是在当前RC(当前RC概念见1.2节)下进行的,故不需要传入RC句柄。Windows系统支持OpenGL渲染,Win32库提供了用于初始化像素格式、控制渲染和使用OpenGL扩展的函数(w
4、gl打头的函数)。下面对几个常用的wgl函数的功能进行简单介绍。(1)HGLRCwglCreateContext(HDChdc)该函数用来创建一个OpenGL可用的渲染上下文RC。(2)BOOLwglDeleteContext(HGLRChglrc)该函数删除一个RC。(3)HGLRCwglGetCurrentContext(void)该函数返回线程的现行RC,如果线程无现行RC则返回NULL。(4)HDCwglGetCurrentDC(void)该函数返回与线程现行RC关联的DC,如果线程无现行RC则返回NULL。(5)B
5、OOLwglMakeCurrent(HDChdc,HGLRChglrc)该函数把hdc和hglrc关联起来,并使hglrc成为调用线程的当前RC。1.2.OpenGL多视图渲染的原理上文提到,用OpenGL绘图首先必须创建一个RC,在创建RC时与一个DC建立联系(RC也只能通过DC来创建),然后再将其设置为当前RC,这样,OpenGL的函数就可以通过RC对应的DC画到相应的显示设备上。一个RC是否是当前RC,这是针对调用线程而言的,一个线程在拥有现行RC进行绘图时,第1页共5页别的线程将无法同时绘图。一个线程一次只能拥有一个
6、现行RC,但是可以拥有多个RC;一个RC也可以由多个线程共享,但是它每次只能在一个线程中是现行RC;一个RC可以对应多个DC,但在绘图时,只能同时与一个DC挂钩。本文实现多视图采用多个RC和多个DC的模式,其中每个视图对应一个DC,每个DC对应一个RC,故4个视图就有4个DC,4个RC,当需要在某个视图上绘图时,就将该RC切换为当前RC。下文将结合作者的工作经验,以实例的方式介绍如何在VC6.0下创建多个(以4个窗口为例)OpenGL绘图窗口的程序。2.实现窗口的拆分首先用VC6.0AppWizard创建一个SDI的MFC应
7、用程序MultiWindow,然后通过一个CSplitterWnd对象将窗口用静态拆分的方式划分为4部分,如图1。实现拆分过程如下:(1)为CMainFrame添加一个CSplitter-Wnd类型的对象m_wndSplitter;(2)添加3个视图类:CTopLeftView,CBottomLeftView,CBottomRightView,这样,加上CMutiWindowView,一共有4个视图类;(3)为CMainFrame重载OnCreate-Client()函数,在函数体添加代码为4个子窗口关联相应的视图,如下:m
8、_wndSplitter.CreateStatic(this,2,2);//为每个窗口生成视图m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTopLeftView),CSize(100,100),pContext);m_wndSplitter.Cr
此文档下载收益归作者所有