我要发帖 回复

正式会员

6

主题

23

积分

0

专家分

:

私信
发表时间 : 2008-12-12 08:53:48 | 浏览 : 2623    评论 : 1
我在MSDN上查寻了下glutCreateSubWindow(int win,int x,int y,int width,int height)函数
win是其父窗口的标记符。x, y是相对父窗口的位移,以像素表示  width,height是子窗口的宽和高
可是在实际程序中却不是这样 例如下面这段代码
#include <math.h>
#include <stdio.h>
#include <GL\glut.h>
#include <stdlib.h>
#include <stdarg.h>

GLuint sub_width = 256, sub_height = 512;


GLuint window, screen, command;

void
main_reshape(int width,  int height)
{
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, width, height, 0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

#define GAP  25   /* gap between subwindows */
        sub_width = (width-GAP*3)/2.0;
        sub_height = (height-GAP*2);

        glutSetWindow(screen);
        glutPositionWindow(GAP, GAP);
        glutReshapeWindow(sub_width, sub_height);

}

void
main_display(void)
{
        glClearColor(0.8f, 0.8f, 0.8f, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3ub(0, 0, 0);

        glutSwapBuffers();
}

void
screen_reshape(int width, int height)
{
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D ((GLdouble) 100-width/2, (GLdouble) 100+width/2,
                (GLdouble) 100-height/2, (GLdouble) 100+height/2);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

void
screen_display(void)
{
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSwapBuffers();
}


int
main(int argc, char** argv)
{
        glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
        glutInitWindowSize(640+GAP*3, 512+GAP*2);
        glutInitWindowPosition(50, 50);
        glutInit(&argc, argv);

        window = glutCreateWindow("Shapes");
        glutReshapeFunc(main_reshape);
        glutDisplayFunc(main_display);
       
        screen = glutCreateSubWindow(window, GAP, GAP, 256, 256);
        glutReshapeFunc(screen_reshape);
        glutDisplayFunc(screen_display);
        glutMainLoop();
        return 0;
}
我改变screen = glutCreateSubWindow(window, GAP, GAP, 256, 256);行中的任何数据都不会影响子窗口的大小位置
而是要通过 改变main_reshap函数中的
glutSetWindow(screen);
glutPositionWindow(GAP, GAP);
glutReshapeWindow(sub_width, sub_height);
这些代码才可以改变子窗口的位置和大小
如果是这样
glutCreateSubWindow函数后的参数还有什么意义呢?
还有为什么定义子窗口正投影要写成
gluOrtho2D ((GLdouble) 100-width/2, (GLdouble) 100+width/2,
                (GLdouble) 100-height/2, (GLdouble) 100+height/2);
难道子窗口的和主窗口不是互相独立的?
请各位帮我解释下 先谢谢大家了 ^^

最近VR访客

tan_dunming 评论于2008-12-12 14:55:26
http://tieba.baidu.com/f?kz=296727057
网上搜索一下 看看有没有介绍? 既然问题可以解决 那就采用可行的方法吧
追求卓越

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-24 03:03 PM

返回顶部