2

我有一个程序,它允许用户通过对话框选择图像,并显示图像。菜单与图像的右键单击相关联,当用户选择聚类时,会提示用户在控制台输入聚类之间的最小距离。
显示窗口是通过调用该viewer()方法创建的,该方法创建一个窗口并为其设置 GLUT 属性。
我想在提示用户在控制台输入时破坏带有加载图像的原始窗口,因为很多时候,控制台窗口妨碍了图像显示窗口。

用户在控制台输入值后,我希望窗口再次显示。但问题是,虽然我在读入输入后调用了该函数,但直到下一个函数调用完成执行viewer()后,该窗口才会再次出现。Clustering()如果我没有破坏第一个窗口并将我的控制台窗口移开,但是我能够在执行聚类算法时看到图像的变化。

我的问题是,为什么这个显式调用createWindow被忽略并执行下一个命令。我尝试使用glFinish,但没有帮助:-(有人可以为我提供解决方案吗?

我的伪代码如下所示:

Clustering()
{
    loop
    {
        image processing code
    }
    display()  ;
}

...

display()
{
    drawing code
    glutSwapBuffers()
}

void viewer() {

   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
   glutInitWindowSize(width, height);
   glutInitWindowPosition(100, 100);

   win = glutCreateWindow("Image"); 

   glutCreateMenu(menu);
   glutAddMenuEntry("Load Image", 1);
   glutAddMenuEntry("Clustering", 3);
   glutAddMenuEntry("QUIT", 99);
   glutAttachMenu(GLUT_RIGHT_BUTTON);
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutMouseFunc(mouse);
}

void menu(int id) {

glutSwapBuffers();

switch (id){
    case 1://Open image
                    ...........
        break;  

    case 3://Clustering
        glutDestroyWindow(win);
        cout << "Please enter in the minimum distance between regions - a value between 1 and " << max_distance << ": \n";
        cin >> distance;

        Viewer();
        Clustering();
        break;

    case 99:
        exit(0);
}
glutPostRedisplay();
}

main()
{
    ....
    viewer();
    glutMainLoop();
}

哦,顺便说一句,我检查了如何在处理过程中更新 OpenGL 中的显示?已经 。

尽管问题非常相似,但实际问题略有不同。

4

1 回答 1

0

我不认为事情会像你想象的那样运作。例如glutDestroyWindow,还破坏了 OpenGL 上下文(这是 GLUT 的限制,而不是 OpenGL,它允许在没有窗口的情况下“处于边缘”的 OpenGL 上下文,很好)。因此,如果您不断地创建和销毁窗口,您还必须重新加载其间的所有图像、纹理等。

说真的,如果您像以前一样克服了 GLUT 的这些限制,那么是时候放弃 GLUT 并使用“真正的”工具包了。像 Qt 或 wxWidgets 或 GTK+。

于 2012-10-27T10:27:42.373 回答