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

Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows

 

重整函数的回调需要处理两件事:修改子窗体的大小,重新计算投影每个子窗体的投影矩阵.在我们的情况中,我们不需要渲染任何几何图案到主窗体,所以我们可以跳过重新计算投影矩阵这一步.

先来介绍修改大小和重定位子窗体的函数原型.

 

void glutPositionWindow(int x, int y);
void glutReshapeWindow(int width, int height);

x, y - 窗体的左上角

width, heith - 窗体的像素维度

 

这里有两个函数可以作用到当前窗体,所以我们必须设置一个特殊的窗体来作为当前窗体.为了这个,我们要把窗体ID传入glutSetWindows.原型如下:

 

void glutSetWindow(int windowIdentifier);

windowIdentifier - 创建窗体的返回值

 

如果我们需要知道哪个窗体是当前窗体(获得焦点),我们可以用glutGetWindow函数.

 

int glutGetWindow();

该函数的返回值是当前窗体(获得焦点)的ID.

在定位和更改窗体大小之前,我们必须设置每个子窗体为当前窗体.下面代码提供了重整函数,用到changeSize函数.上一节说过,我们要定义一个回调来专门给主窗体重整窗体.这样已经足够了,因为用户默认只能更改主窗体.

在我们的示例中,投影和所有子窗体类似,我们将会定义一个函数来实现,并在每个子窗体调用它.

int w,h, border=6;

...

 



void setProjection(int w1, int h1)

{

    float ratio;

    // Prevent a divide by zero, when window is too short

    // (you cant make a window of zero width).

    ratio = 1.0f * w1 / h1;

    // Reset the coordinate system before modifying

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();



    // Set the viewport to be the entire window

        glViewport(0, 0, w1, h1);



    // Set the clipping volume

    gluPerspective(45,ratio,0.1,1000);

    glMatrixMode(GL_MODELVIEW);

}



void changeSize(int w1,int h1) {



    if(h1 == 0)

        h1 = 1;



    // we're keeping these values cause we'll need them latter

    w = w1;

    h = h1;



    // set subwindow 1 as the active window

    glutSetWindow(subWindow1);

    // resize and reposition the sub window

    glutPositionWindow(border,border);

    glutReshapeWindow(w-2*border, h/2 - border*3/2);

    setProjection(w-2*border, h/2 - border*3/2);



    // set subwindow 2 as the active window

    glutSetWindow(subWindow2);

    // resize and reposition the sub window

    glutPositionWindow(border,(h+border)/2);

    glutReshapeWindow(w/2-border*3/2, h/2 - border*3/2);

    setProjection(w/2-border*3/2,h/2 - border*3/2);



    // set subwindow 3 as the active window

    glutSetWindow(subWindow3);

    // resize and reposition the sub window

    glutPositionWindow((w+border)/2,(h+border)/2);

    glutReshapeWindow(w/2-border*3/2,h/2 - border*3/2);

    setProjection(w/2-border*3/2,h/2 - border*3/2);

}

 

你可能感兴趣的:(教程)