openGL createWindow在应用程序代码结束前不会执行
我有一个程序,允许用户通过对话框选择图像,并显示图像。菜单与右键单击图像相关联,当用户选择群集时,会提示用户在控制台上输入群集之间的最小距离。openGL createWindow在应用程序代码结束前不会执行,opengl,Opengl,我有一个程序,允许用户通过对话框选择图像,并显示图像。菜单与右键单击图像相关联,当用户选择群集时,会提示用户在控制台上输入群集之间的最小距离。 显示窗口是通过调用viewer()方法创建的,该方法创建窗口并为其设置GLUT属性。 在控制台提示用户输入时,我想销毁带有加载图像的原始窗口,因为很多时候,控制台窗口会妨碍图像显示窗口 在用户在控制台输入值之后,我希望再次显示窗口。但问题是,尽管我在读取输入后调用了viewer()函数,但在下一个函数调用Clustering()完成之前,窗口不会再次出现
显示窗口是通过调用
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();
}
Clustering()
{
环
{
图像处理代码
}
显示();
}
...
显示()
{
绘图代码
glutSwapBuffers()
}
void查看器(){
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(宽度、高度);
位置(100100);
win=创建窗口(“图像”);
创建菜单(菜单);
戊二醛(“加载图像”,1);
戊二醛(“聚类”,3);
戊二醛(“退出”,99);
谷胱甘肽功能表(GLUT_右键);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutMouseFunc(小鼠);
}
无效菜单(int-id){
glutSwapBuffers();
开关(id){
案例1://开放图像
...........
打破
案例3://集群
窗口(win);
cout我不认为事情按照你想象的方式进行。例如,glutDestroyWindow
也会破坏OpenGL上下文(这是GLUT的一个限制,而不是OpenGL,它允许有一个OpenGL上下文“处于边缘”,周围没有窗口,很好)因此,如果您不断创建和销毁窗口,您还必须重新加载其间的所有图像、纹理等
说真的,如果你像你一样已经意识到了过剩的极限,那么是时候放弃过剩,使用“真正的”方法了工具箱。像Qt或wxWidgets或GTK+。首先,glutCreateWindow
和glFinish
没有任何共同之处。其次,您使用的GLUT版本是什么?您是否考虑过使用glutHideWindow
和glutShowWindow
来临时隐藏窗口?我使用的是glut3.6。我的意思是我尝试调用了glFinish()调用createWindow()方法之前。如果我错了,请原谅,但我的理解是glFinish会强制执行所有挂起的操作,然后再继续。我当前使用的是glHideWindw和glShowWindow(),但同样,它似乎没有任何效果:-(谢谢大家!看来我必须在窗口打开的情况下生活,只需使用鼠标手动将焦点切换到窗口。我一直在使用GLUT(它是用于课堂项目,必须在学校的任何系统上运行),但感谢所有的输入!再次感谢!@msnewbie:你们学校的系统上运行的是什么操作系统?嗨,datenwolf,我学校的大多数计算机都安装了Windows 7和VisualStudio 2010。谢谢!我必须补充一点,我们获得了glut32.dll、glut.h和glut32.lib文件用于项目。自定义glut.h文件包括glu/GL.h和GL/glu.h下的glut头文件。@msnewbie:好吧,那真的不多。如果你的目标是长远的,你仍然可以直接使用Win32 API。这有点乏味,但实际上可能比被glut拖累要好。