浮动窗体中的OpenGL多视图的实现

由于在工作中需要结合浮动窗体实现OpenGL的多视图,用于得到三维实体的三视图观察效果,通过参考其它资料,设计了一个程序框架,在此基础之上大家可以根据自己的需要进行扩充,实现需要的功能。

本程序中浮动窗体的实现从以下网站得到支持:www.datamekanix.com

程序实现效果图


关键技术实现介绍:

一、OpenGL多视图的实现

平常我们的程序大部分都是建立一OpenGL设备上下文,但在本程序中,由于要实现三维实体的多视图观察功能,因此,需要建立多OpenGL设备上下文,并在需要的时候进行切换。

同一般的OpenGL程序一样,我们在每个视图类中都定义了每个视图所对应的设备描述上下文并在视图创建的时候建立了这个设备描述上下文。

//add in the header file of view class
public:
CClientDC* m_pDC;
HGLRC m_hRC;
//add in the init() function of view class
m_hRC = wglCreateContext(m_pDC->GetSafeHdc());

接着在某个视图需要更新的时候(一般在每个视图的OnDraw()函数中),将这个视图的设备上下文设为OpenGL当前的渲染上下文(OpenGL Rendering context)

//add in the OnDraw() function of view class
//set current device
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

二、视图类型的切换及当前视图类型的判断

由于同一视图在不同的时刻根据用户的需要可能有不同的功能,因此需要在几个视图之间进行功能的切换。本程序选取一个视图作为主视图,而另外两个视图作为子视图。视图的类有一下几种:上、下视图,前、后视图,左、右视图。为此设计了枚举类型变量用于指示视图的类型。为了保证不同视图类型之间的有效切换,即不会产生重复的类型,设计了一个类用于操作视图之间的类型切换。

为了减小程序编制的负担,所有子视图共享一个视图类,而每个视图的当前类型是存储在这个视图类之外的,因此在每个视图绘制的时候都需要判断自己的类型。这样便出现了无法在子视图类中判断自己当前的视图类型的情况。为此在子视图类中增加了一个成员变量用于记录自己的类型。

//add in the header file of child view class
//view ID, it will be assigned by parentframe when this program begin
//[childviewA id = 1; childviewB id = 2]
int m_ViewID

时间: 2024-10-25 22:11:28

浮动窗体中的OpenGL多视图的实现的相关文章

窗体中字段顺序不同于Access 2007中记录源中字段顺序

症状 Microsoft Office Access 2007, 中拖动字段到窗体, 时窗体中字段顺序不同于记录源中字段顺序. 如果下列条件为真会发生此问题: • 在拖动字段来自记录源中的表. • 您将字段拖动到版式视图中窗体. 原因 出现此问题的是因为中表记录源中字段显示顺序与中访问 2007 返回字段顺序无关. 更多信息 步骤来重现问题 1. 在 Access 2007年打开数据库. 2. 关闭所有打开对象. 3. 在 创建 选项卡, Forms 组中单击 空白表单 . 窗体版式视图中打开.

Opengl ES 视图与投影

注:不得不转这一篇,因为这一篇里有两个资源链接,而这两篇链接中还有链接,有空儿一定好好读一读. opengl es 视图与投影 博客分类:  android   关于android的投影矩阵,一般有两种,一种是矩阵投影,另一种是透视投影.  矩阵投影主要用于2D画面,但指定此投影的方式却有多种方式,而且对于初入门的人来说,也不容易理解,可以使用glOrthof,此方法使用方式大概如下:  Java代码   GL10 gl = glGraphics.getGL();   gl.glViewport

《Visual Basic 2012入门经典》----2.4 使用工具箱将控件添加到窗体中

2.4 使用工具箱将控件添加到窗体中 Visual Basic 2012入门经典IDE提供了一些方便的工具来创建应用程序的图形用户界面(GUI).大多数GUI由一个或多个窗体(窗口)组成,窗体包含各种元素,如文本框.列表框和按钮.工具箱用于将控件放到窗体上.图2.7是刚打开或创建Visual Basic项目时的默认工具箱.这些控件将在第7章和第8章详细讨论. 可以使用下列4种方法将控件添加到窗体中. 在工具箱中,单击代表要放到窗体中的控件的工具,然后在窗体中单击并拖曳来指定要放置的位置,这实际上

android 在代码中如何设置 根视图的宽高?

问题描述 android 在代码中如何设置 根视图的宽高? android 在代码中如何设置 根视图的宽高? 如何设置视图container的宽高? public void popEdit(EditText _edit) { // edit=_edit; LinearLayout container=new LinearLayout(cont); container.setOrientation(LinearLayout.HORIZONTAL); LinearLayout.LayoutParam

在同一窗体中使用PHP来处理多个提交任务

在PHP中的处理窗体数据比其它网页程序语言更简单--如果你使用这种语言一段时间后,你会发现这是一个不可争辩的事实.这种操作的简易性使它可以容易地处理更为复杂的窗体事件,包括今天讨论的主题,即在同一个窗体中通过多个按钮来处理不同的任务. 为什么使用多个提交任务? 在我回答这个问题之前,先让我回答一个很显然的问题:既然许多窗体更适合单一的提交按钮,为什么有时人们需要的是两个(或者是更多)的提交按钮? 对这一问题最好的解释方法是用我最近开发项目中的一个实例来说明.在这一项目中,我的任务是给一个图书馆建

使用准则进行条件查询--1.4.从窗体中选择查询的条件

4.从窗体中选择查询的条件 前面的方法虽然简单,但对用户来说操作不够方便,对设计者来说也难以控制,如果通过窗体来实现,这些问题就可以解决了. 如下面的窗体,运行时用户可以在组合框中选择要查询司机的姓名,按下查询按钮就可以看到查询的结果. 下面详细地列出设计的步骤: 创建一个窗体,按下控件向导按钮,在窗体上添加一个组合框.在第一个对话框中选择"我想让组合框在一个表或查询中查找这些值",下一步. 选择一个为组合框提供数据的表或查询.下一步. 选择组合框中要显示的数据,通常除了选择要显示在组

新手来看:在Access的窗体中如何确定选项页控件中当前的激活页?

access|控件 新手来看:在Access的窗体中如何确定选项页控件中当前的激活页?  专题地址:http://access911.net/index.asp?board=4&recordid=71FAB31E10DCE7F3 简述:在Access的窗体中如何确定选项页控件中当前的激活页?    问题: 我在窗体(Access)上添加了一个选项卡工具,有两页.分别是t_TableDescription和t_FieldDescription,请问我在代码中怎样确定当前激活的选项页是哪一页?  回

Delphi类的入门例子(8): 遍历窗体中所有控件的函数

//显示窗体中所有控件的函数 function GetCtrls(Control: TWinControl; List: TStringList): Boolean; var i: Integer; obj: TWinControl; begin for i := 0 to Control.ControlCount-1 do begin obj := TWinControl(Control.Controls[i]); List.Add(obj.Name); //如果控件中包含其他控件, 则递归调

在对话框和窗体中使用系统图标

大家知道,很多Windows程序都要使用MessageBox,只要在这个API函数的一个参数中使用MB_ICONQUESTION标志,便可以在MessageBox的对话框中显示问号图标.这样用不同的标志便可以显示不同的图标.与Windows以前的老版本相比,Windows 2000以及Windows XP中的图标越来越好看,种类也越来越多.为了更广泛地使用这些漂亮的图标,本文将介绍如何把它们运用到自己的对话框或窗体中去.为此,首先要解决的问题是:在哪里以及如何获取这些图标? 这个问题属于Wind