Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwindows

利用GLUT我们可以定义子窗体,例如切分主窗体到不同区域,每个子窗体有自己的OpenGL上下文和回调函数.一个可行的程序是可以同时提供几种相同场景的视觉.

为了创建子窗体,我们可以使用glutCreateSubWindow函数,原型如下:

int glutCreateSubWindow(int parentWindow, int x, int y, int width, int height);

parentwindow - 父窗体的ID

x, y - 子窗体的左上角,相对于父窗体的原始

width, height - 子窗体的大小

父窗体的ID是创建父窗体时的返回值.下面代码显示了关系:

    mainWindow = glutCreateWindow("SnowMen from Lighthouse3D");
...
subWindow1 = glutCreateSubWindow(mainWindow, ,,,);

一个子窗体也是变成其它子窗体的父窗体.根据GLUT的说明文档,窗体可以任意嵌套.

前面说过,一个子窗体有自己的OpenGL上下文,如果我们要用VBOs时,需要为每个窗体和子窗体创建它们.回调函数也一样.

最低限度我们必须用glutDisplayFunc函数为每个窗体注册显示函数.我们还必须为每个窗体注册光标更改和鼠标事件控制的回调函数,如果我们要用到这些特性的话.弹出菜单也分配给一个特定的窗体.注意的是,空闲函数只有一个.

假定我们要创建三个视觉.一个主镜头,另一个是顶部视觉,在主镜头的中间,第三个是在旁边,也是在主镜头的中间.下面是例图:

下面是初始化必需的一个更完整的版本.我们创建了函数来注册回调和演示一些OpenGL初始化,用到所有子窗体中.我们也声明了三个变量来保存窗体和子窗体的ID,稍后会用到.

int mainWindow, subWindow1,subWindow2,subWindow3;
...
void init() { glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE); // register callbacks
glutIgnoreKeyRepeat();
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(pressKey);
glutSpecialUpFunc(releaseKey);
glutMouseFunc(mouseButton);
glutMotionFunc(mouseMove);
} int main(int argc, char **argv) { // init GLUT and create main window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(,);
glutInitWindowSize(,);
mainWindow = glutCreateWindow("Lighthouse3D - GLUT Tutorial"); // callbacks for main window
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutIdleFunc(renderSceneAll);
init(); // sub windows
subWindow1 = glutCreateSubWindow(mainWindow, border,border,w-*border, h/ - border*/);
glutDisplayFunc(renderScenesw1);
init(); subWindow2 = glutCreateSubWindow(mainWindow, border,(h+border)/,w/-border*/, h/ - border*/);
glutDisplayFunc(renderScenesw2);
init(); subWindow3 = glutCreateSubWindow(mainWindow, (w+border)/,(h+border)/,w/-border*/,h/ - border*/);
glutDisplayFunc(renderScenesw3);
init(); // enter GLUT event processing cycle
glutMainLoop(); return ;
}

上面的代码创建了三个子窗体.每个子窗体都用户显示同一个场景的不同视点.顶部的子窗体显示自由移动的镜头,从顶端观察底部的左边到右边.

当窗体创建后,无论窗体还是子窗体,都会变成当前窗体(获得焦点).所有回调会被注册到当前新创建窗体,除了空闲函数之外,之前说过该函数是整个应用程序唯一的.

注意我们要调用initScene函数来为所有子窗体初始化OpenGL上下文.还要注意我们只为主窗体注册一次重整函数.

子窗体不用时可以关闭.用到的函数是glutDestroyWindow.

void glutDestroyWindow(int windowIdentifier)

windowIdentifier - 创建窗体时的返回值

该函数会关闭窗体和它包含的子窗体,还有它绑定的所有OpenGL上下文.

下一节我们会探讨重整函数和渲染函数.

[译]GLUT教程 - 创建和关闭子窗体的更多相关文章

  1. [译]GLUT教程(目录)

    http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...

  2. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

  3. dev控件 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内

    前言 本文主要讲解 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内,顺便附上Float(浮动)的时候使窗体最大化,及指定只能某一个子窗体能浮动放大. 下面进入正题. 一.首 ...

  4. [译]GLUT教程 - 渲染到子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Rendering to Subwindows 先回顾一下之前 ...

  5. [译]GLUT教程 - 重整子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows 重整函数的回调需要处理两 ...

  6. [译]NeHe教程 - 创建一个OpenGL窗体

    原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...

  7. [译]GLUT教程 - 改变窗体大小

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Resizing the Window 上一章的例子创建了两个窗体,命 ...

  8. [译]GLUT教程 - 游戏模式

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...

  9. C# 关闭子窗体释放子窗体对象问题

    1 在主窗口中实例化子窗口 Form2 f2 = new Form2(); 2 通过按钮来显示子窗口 f2.Show(); 3 关闭子窗口而不释放子窗口对象的方法 protected override ...

随机推荐

  1. java标识符与命名规则

    标识符就是给变量.类或方法起的名字.可以用字母.下划线或美元符号开头,区分大小写,没有最大长度限制.(关键字除外) 关键字   访问控制 private protected public       ...

  2. hadoop之linux常用命令

    Linux的命令后面会有命令选项,有的选项还有选项值.选项的前面有短横线“-”,命令.选项.选项值之间使用空格隔开.有的命令没有选项,会有参数.选项是命令内置的功能,参数是用户提供的符合命令格式的内容 ...

  3. Python的Web编程[1] -> Web服务器[0] -> Web 服务器与 CGI / WSGI

    Web服务器 / Web Server 对于Web来说,需要建立一个Web服务器,必须建立一个基本的服务器和一个处理程序, 基本服务器的主要作用是,在客户端和服务器端完成必要的HTTP交互, 处理程序 ...

  4. 数学【p2117】 小z的矩阵

    题目描述-->p2117 小z的矩阵 分析: 题目给定我们一个正方形. 容易想到,正方形是对称的. 推敲一下 如果我们的矩阵是这样的↓ 闭眼瞎敲出来的. \[\begin{bmatrix} {0 ...

  5. POJ 3713 Transferring Sylla (三连通图)

    [题目链接] http://poj.org/problem?id=3713 [题目大意] 给出一个图判断是不是三连通图,三连通图的意思是对于图中任意两点, 至少有三条路是可以相互连通的. [题解] 我 ...

  6. UITableView中的dequeueReusableCellWithIdentifier的方法

    在使用UITableView控件的时候,datasource的代理方法经常会使用到下面的方法来加载UITableView的数据显示 - (UITableViewCell *)tableView:(UI ...

  7. sql server 2008 R2 数据库文件大小限制

    select @@version SQL2005 分五个版本,如下所列: 1.Enterprise(企业版) 2.Development(开发版) 3.Workgroup,(工作群版) 4.Stand ...

  8. linux命令详解:basename命令

    转:http://www.cnblogs.com/lwgdream/archive/2013/11/05/3407768.html 前言 bashname命令用于获取路径中的文件名或路径名(获取的时候 ...

  9. ES6里关于模板字面量的拓展

    JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系 ...

  10. 分布式服务自增长唯一ID小结

    1.常用生成唯一ID的方式,例如UUID 2.生成唯一自自增长ID方式: 例如: Zookeeper的增加ID: redis的incr方法 mongodb的objectId 3.采用雪花模型 如下代码 ...