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. Python的网络编程[2] -> TFTP 协议[1] -> TFTP 的 Python 实现

    TFTP实现 / TFTP Implement 目录 TFTP 的服务器建立过程 TFTP 的客户端建立过程 1 TFTP 的服务器建立过程 服务器建立步骤主要有: (1)      设定服务器IP和 ...

  2. Linux Shell 参数传递多种方式

    背景 最近编写ansible脚本,需要自动调用之前写好的shell脚本,由于shell脚本中包含了read命令接收用户的手动输入,为了实现ansible脚本的自动运行,不得不将手动输入转换为自动输入. ...

  3. AppScan入门工作原理详解

    AppScan,即 AppScan standard edition.其安装在 Windows 操作系统上,可以对网站等 Web 应用进行自动化的应用安全扫描和测试. Rational AppScan ...

  4. Android简单文件浏览器源代码 (转)

    Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...

  5. 1.NFC入门

    1.什么是NFC? 近距离无线通信技术(Near Field Communication,NFC).NFC提供了一种简单的.非触控式的解决方案,可以让消费者简单直观地交换信息.访问内容与服务. 2.运 ...

  6. Spark-shell启动脚本解读

    #!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contrib ...

  7. 关于asp.net mvc中 weiui gallery中IOS 下不显示预览图片问题的解决方式

    IOS 下面不显示预览. 结果去掉了红框中的缓存部分 就可以显示了 备忘,也帮助一下需要的朋友 @*<meta http-equiv="pragma" content=&qu ...

  8. selenium清空元素时,.clear不执行

    应该是由于鼠标焦点没有定位到相应元素 driver.find_element_by_xpath('//input[@type="password"]').click() drive ...

  9. 输入法不能使用ctrl+shift进行切换的问题

    第一种情况就是,你的输入法只有一种(而且这种输入法并不是“中文(简体) 微软拼音输入法”). 如果是只有一种输入法的话,是无法进行切换的,如果你是想要把输入法切换到无输入法状态,那么你可以通过设置任务 ...

  10. 在eclipse中使用Lombok

    1.下载Lombok.jar http://projectlombok.googlecode.com/files/lombok.jar2.运行Lombok.jar: java -jar  D:\001 ...