我有一个程序,允许用户通过对话框选择图像,并显示图像。菜单与右键单击图像相关联,当用户选择群集时,系统会提示用户在控制台输入群集之间的最小距离。
显示窗口是通过调用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();
}
哦,顺便说一句,我已经检查了How to update display in OpenGL during processing?。
虽然问题非常相似,但实际问题略有不同。
答案 0 :(得分:0)
我认为事情不会像你想象的那样发挥作用。例如glutDestroyWindow
也会破坏OpenGL上下文(这是GLUT的限制,而不是OpenGL,它允许在没有窗口的情况下使用OpenGL上下文,就好了)。因此,如果您经常创建和销毁窗口,您还必须重新加载所有图像,纹理等。
说真的,如果你像往常一样重新调整了GLUT的限制,那么就该放弃GLUT并使用“真正的”工具包了。像Qt或wxWidgets或GTK +。