C++ OpenGL子窗口don';我不能同时回应

C++ OpenGL子窗口don';我不能同时回应,c++,opengl,glut,codeblocks,viewport,C++,Opengl,Glut,Codeblocks,Viewport,我有一个问题,我正在使用glut(openGL实用工具工具包)。我正在主窗口中制作一个子窗口。主窗口显示一个简单的地物,子窗口显示另一个视图中的地物。图形会旋转,因此应始终重新显示主窗口和子窗口 但这两个窗口中只有一个显示旋转的图形。因此,当我启动程序时,主窗口中的图形会旋转,但子窗口中的图形不会旋转,它只是静止不动 当我在子窗口中移动鼠标并按下任意键时,角色会发生变化,因此人物会在子窗口中旋转,并在主窗口中静止不动 如何让它们同时显示。我遵循了灯塔的教程,但它没有给我答案。 我必须对我的视口做

我有一个问题,我正在使用glut(openGL实用工具工具包)。我正在主窗口中制作一个子窗口。主窗口显示一个简单的地物,子窗口显示另一个视图中的地物。图形会旋转,因此应始终重新显示主窗口和子窗口

但这两个窗口中只有一个显示旋转的图形。因此,当我启动程序时,主窗口中的图形会旋转,但子窗口中的图形不会旋转,它只是静止不动

当我在子窗口中移动鼠标并按下任意键时,角色会发生变化,因此人物会在子窗口中旋转,并在主窗口中静止不动

如何让它们同时显示。我遵循了灯塔的教程,但它没有给我答案。 我必须对我的视口做些什么吗

 * GLUT Shapes Demo
 *
 * Written by Nigel Stewart November 2003
 *
 * This program is test harness for the sphere, cone
 * and torus shapes in GLUT.
 *
 * Spinning wireframe and smooth shaded shapes are
 * displayed until the ESC or q key is pressed.  The
 * number of geometry stacks and slices can be adjusted
 * using the + and - keys.
 */
#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <math.h>
#include <stdlib.h>

static int slices = 16;
static int stacks = 16;
int m=0;


int mainWindow,SubWindow, SubWindow2;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-10,10,-10,10,-10,10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }


    //glutPostRedisplay();
}
void keyp(int key, int xx, int yy) {


    glutSetWindow(mainWindow);
    glutPostRedisplay();

}

void displaysub()
{const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
     glClearColor(20,1,1,1);
     glLoadIdentity();
     glOrtho(-5,5,-5,5,-5,5);
    glColor3f(0,0,0);
glRotated(a,0,0,10);
    glPushMatrix();
        glTranslated(0,0,0);
        glutSolidSphere(2,10,10);
    glPopMatrix();

    glutSwapBuffers();
}

void display()
{const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;
        glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
     glClearColor(3,0,0,1);
glLoadIdentity();
     glOrtho(-10,10,-10,10,-10,10);
     glRotated(a,10,10,0);


displaysub();


}

static void idle(void)
{
    glutPostRedisplay();
}

/* Program entry point */
void init()
{


    glClearColor(3,0,0,1);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    // register callbacks
    glutIgnoreKeyRepeat(1);
    glutKeyboardFunc(key);
    glutSpecialFunc(keyp);

}



int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);


    mainWindow = glutCreateWindow("GLUT Shapes");
        glutSetWindow(mainWindow);
        glClearColor(3,0,0,1);
        glutDisplayFunc(display);
        init();


    SubWindow = glutCreateSubWindow(mainWindow,0,0,50,50);
        glutSetWindow(SubWindow);
        glClearColor(3,0,0,1);
        glutDisplayFunc(displaysub);
        init();



  glutIdleFunc(idle);
    glutMainLoop();

    return 1;
}
*GLUT形状演示
*
*Nigel Stewart于2003年11月撰写
*
*该程序是球体、圆锥体的测试线束
*以及过剩的圆环形状。
*
*旋转的线框和平滑的阴影形状
*显示,直到按下ESC或q键。这个
*可以调整几何体堆栈和切片的数量
*使用+和-键。
*/
#包括
#苹果__
#包括
#否则
#包括
#恩迪夫
#包括
#包括
静态int切片=16;
静态整数堆栈=16;
int m=0;
int主窗口、子窗口、子窗口2;
/*GLUT回调处理程序*/
静态空心调整大小(整型宽度、整型高度)
{
常量浮点ar=(浮点)宽度/(浮点)高度;
glViewport(0,0,宽度,高度);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-10,10,-10,10,-10,10);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
静态无效键(无符号字符键,整数x,整数y)
{
开关(钥匙)
{
案例27:
案例‘q’:
出口(0);
打破
格“+”:
切片++;
堆栈++;
打破
案例'-':
如果(切片>3和堆栈>3)
{
切片--;
堆栈--;
}
打破
}
//再发现();
}
无效密钥(整数密钥,整数xx,整数yy){
设置窗口(主窗口);
再发现();
}
void displaysub()
{const double t=glutGet(GLUT运行时间)/1000.0;
常数双a=t*90.0;
glClear(GL_深度_缓冲_位| GL_颜色_缓冲_位);
glClearColor(20,1,1,1);
glLoadIdentity();
格洛托(-5,5,-5,5,-5,5);
gl3f(0,0,0);
(a,0,0,10);
glPushMatrix();
gl(0,0,0);
固体球(2,10,10);
glPopMatrix();
glutSwapBuffers();
}
无效显示()
{const double t=glutGet(GLUT运行时间)/1000.0;
常数双a=t*90.0;
glClear(GL_深度_缓冲_位| GL_颜色_缓冲_位);
glClearColor(3,0,0,1);
glLoadIdentity();
格洛托(-10,10,-10,10,-10,10);
(a,10,10,0);
displaysub();
}
静态无效空闲(无效)
{
再发现();
}
/*程序入口点*/
void init()
{
glClearColor(3,0,0,1);
glEnable(GLU深度试验);
glEnable(GL_CULL_面);
//注册回调
GLUTIGNOREKEYREPLATE(1);
键盘功能(键);
glutSpecialFunc(keyp);
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitWindowSize(640480);
位置(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
主窗口=glutCreateWindow(“GLUT形状”);
设置窗口(主窗口);
glClearColor(3,0,0,1);
glutDisplayFunc(显示器);
init();
子窗口=子窗口(主窗口,0,0,50,50);
设置窗口(子窗口);
glClearColor(3,0,0,1);
glutDisplayFunc(displaysub);
init();
glutIdleFunc(空闲);
glutMainLoop();
返回1;
}
上的文档指定只调用当前窗口的display func。在这种情况下,有两个窗口。我不是使用glut的专家,但我建议做两个改变

display()
函数中删除
displaysub()
,然后重写
idle()

glutPostRedisplay
只是在主循环中标记要更新的窗口,我猜这是一个有鼠标焦点的窗口。通过独立于当前窗口对每个窗口进行post,所有窗口都将收到各自的显示调用

上的文档指定仅调用当前窗口的显示函数。在这种情况下,有两个窗口。我不是使用glut的专家,但我建议做两个改变

display()
函数中删除
displaysub()
,然后重写
idle()


glutPostRedisplay
只是在主循环中标记要更新的窗口,我猜这是一个有鼠标焦点的窗口。通过为每个独立于当前窗口的窗口发帖,所有窗口都将收到各自的显示呼叫

请向我们显示您的代码。我已使用代码编辑请向我们显示您的代码。我已使用代码编辑谢谢,它可以工作!!!但为什么它会起作用呢?你更新主窗口中的子窗口了吗?谢谢,它可以工作!!!但为什么它会起作用呢?是否更新主窗口中的子窗口?
static void idle()
{
  int currentWindow = glutGetWindow();
  glutSetWindw(mainWindow);
  glutPostRedisplay();
  glutSetWindw(subWindow);
  glutPostRedisplay();
  glutSetWindow(currentWindow);
}