2012-10-27 60 views
2

我有一個程序,它允許用戶通過對話框選擇圖像,並顯示圖像。菜單與圖像上的右擊相關聯,並且當用戶選擇羣集時,提示用戶在控制檯處輸入羣集之間的最小距離。
通過調用viewer()方法創建顯示窗口,該方法創建一個窗口併爲其設置GLUT屬性。
在控制檯提示用戶輸入時,我想用加載的圖像摧毀原始窗口,因爲很多時候,控制檯窗口已經進入了圖像顯示窗口。openGL createWindow將不會執行,直到應用程序代碼結束

用戶在控制檯輸入值後,我希望窗口再次顯示。但問題是,雖然我在輸入內容後調用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?了。

雖然問題是非常相似的,實際的問題略有不同。

+1

首先,'glutCreateWindow'和'glFinish'沒有什麼共同之處。其次,你正在使用什麼版本的GLUT? – glcoder

+0

您是否考慮過使用'glutHideWindow'和'glutShowWindow'來暫時隱藏窗口? – stativ

+0

我正在使用glut3.6。我的意思是我在調用createWindow()方法之前嘗試調用glFinish()。如果我錯了,請原諒我,但我的理解是,glFinish在繼續之前強制所有未決操作被執行。 – msnewbie

回答

0

我不認爲事情的工作你想象的方式。例如glutDestroyWindow也破壞了OpenGL上下文(這是GLUT的一個限制,而不是OpenGL,它允許在沒有窗口的情況下使用OpenGL上下文)。因此,如果您不斷創建和銷燬窗口,則還必須重新加載所有圖像,紋理等。

說真的,如果你已經像GLUT那樣重新規定了GLUT的極限,那麼就該放棄GLUT並使用「真正的」工具包了。像Qt或wxWidgets或GTK +一樣。

+0

謝謝大家!看起來我將不得不與窗口打開並且只需要手動將焦點切換到它鼠標我堅持使用GLUT(這是一個課程項目,必須在學校的任何系統上運行),但感謝所有的輸入!再次感謝! – msnewbie

+0

@msnewbie:什麼操作系統在您的學校系統上運行? – datenwolf

+0

您好datenwolf,我學校的大部分電腦都安裝了Windows 7,並且安裝了VisualStudio 2010.謝謝!我必須補充,我們給了glut32.dll,glut.h和glut32.lib文件來使用這個項目。 glut.h文件包括GL/gl.h和GL/glu.h下的glut文件頭文件。 – msnewbie

相關問題