ユーザーがダイアログボックスから画像を選択して表示できるプログラムがあります。メニューは画像の右クリックに関連付けられており、ユーザーがクラスタリングを選択すると、コンソールでクラスター間の最小距離を入力するように求められます。表示ウィンドウは、ウィンドウを作成し、そのGLUTプロパティを設定するメソッドを
呼び出すことによって作成されます。
多くの場合、コンソールウィンドウが画像表示ウィンドウの邪魔になるため、ユーザーがコンソールで入力を求められたときに、ロードされた画像で元のウィンドウを破棄したかったのです。viewer()
ユーザーがコンソールで値を入力した後、ウィンドウが再び表示されるようにしたかったのです。しかし、問題は、入力を読み込んだ後に関数を呼び出しても、次の関数呼び出しの実行が終了する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の表示を更新する方法を確認しましたか?すでに 。
質問は非常に似ていましたが、実際の問題は少し異なります。