c++ - OpenGL 子窗口不会同时响应

标签 c++ opengl glut codeblocks viewport

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

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

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

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

 * 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;
}

最佳答案

关于 glutPostRedisplay 的文档指定只调用当前窗口的显示函数。在这种情况下,有两个窗口。我不是使用过剩的专家,但我建议进行两处更改

display()函数中移除displaysub()并重写idle()

static void idle()
{
  int currentWindow = glutGetWindow();
  glutSetWindw(mainWindow);
  glutPostRedisplay();
  glutSetWindw(subWindow);
  glutPostRedisplay();
  glutSetWindow(currentWindow);
}

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

关于c++ - OpenGL 子窗口不会同时响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075505/

相关文章:

c++ - 隐藏 Qt 选项卡的标签文本而不将文本设置为空字符串

c++ - 有人可以帮我这个链表吗? C++

c++ - 过剩库中缺少 glutInitContextVersion()

c++ - 双缓冲在笔记本电脑上不起作用,在台式机上起作用

c++ - glutBitmapCharacter 位置文本错误

c++ - 检索有关预处理器指令的信息

c++ - 分离线程中的竞争条件

c++ - openGL - 在 glutTimerFunc 中通过套接字获取数据时出现问题

c - 从另一个线程重绘opengl

c++ - 如何使用 openGL 在窗口的左上角创建菜单