-1

プログラムがあり、メイン ウィンドウからサブウィンドウを作成しました。問題は、常にそこにあるということです。私の目標は、キーを押してそのサブウィンドウを「オン」にし、もう一度押すと消えるようにすることです。私は glutDistroyWindow でそれを破壊することができましたが、再び表示する方法がわかりません。これが私のコードです:

void init(void)
{

    // pregatim o scena noua in opengl
    if(glutGetWindow() == mainWindow)
        glClearColor(0.0, 0.0, 0.0, 0.0);   
    else
        glClearColor(1.0, 1.0, 1.0, 1.0); fereastra
    glEnable(GL_DEPTH_TEST);            
    glShadeModel(GL_SMOOTH);            
    glEnable(GL_LIGHTING);              
    glEnable(GL_NORMALIZE);             
}

void reshape2(int w,int h){

    glViewport(0,0,(GLsizei) w,(GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,(float)w/h,1.0,40.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    init();

}

void reshape(int w, int h)
{
    // Main Window
    glViewport(0,0, (GLsizei) w, (GLsizei) h);
    // calculare aspect ratio ( Width/ Height )
    GLfloat aspect = (GLfloat) w / (GLfloat) h;


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(45, aspect, 1.0, 100);

    // init context
    init();

    if(damageWindow != -1)
        glutDestroyWindow(damageWindow);

    damageWindow=glutCreateSubWindow(mainWindow,0,0,w/5,h/5);
    glutDisplayFunc(display);
    glutReshapeFunc(reshape2);
    glutKeyboardFunc(keyboard);
    glutSpecialFunc(keyboard);
    glutKeyboardUpFunc(keyboardup);
    glutMouseFunc(mouse);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    int w = 800, h= 600;
    glutInitWindowSize(w,h);
    glutInitWindowPosition(100,100);

    // Main window
    mainWindow=glutCreateWindow("Tema4 - Asteroid Attack!");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutKeyboardUpFunc(keyboardup);
    glutReshapeFunc(reshape);
    glutSpecialFunc(keyboard);
    glutMouseFunc(mouse);


    // Initializeaza scena 3D
    initScene();

    glutMainLoop();
    return 0;
}

わかりましたので、これらは重要な機能です。私のキーボード機能では、damageWindow を切り替えたいと思います。それ、どうやったら出来るの ?破壊する方法は知っているが、再び作ることはできないようだ。

LE: 人々は質問を本当に理解していないので、私は反対票を受け取り続けています. そこには何もないため、キーボード機能は冗長です。それが私があなたに求めていることです。

void keyboard(unsigned char ch,int x,int y){
    switch(ch){
        case 27: exit(0);break;
        case 'n':
            view_subwindow=!view_subwindow;
            if(view_subwindow == false)
                glutDestroyWindow(damageWindow);
            else{
                //here i want to recreate my window DONT KNOW HOW
                damageWindow=glutCreateSubWindow(mainWindow,0,0,w/5,h/5);
                glutDisplayFunc(display);
                glutReshapeFunc(reshape2);
                glutKeyboardFunc(keyboard);
                glutSpecialFunc(keyboard);
                glutKeyboardUpFunc(keyboardup);
                glutMouseFunc(mouse);
            }
    }
}
4

1 に答える 1

0

を呼び出した後、ウィンドウを作成または破棄することになっているとは思いませんglutMainLoop。初期化中にサブウィンドウを作成する必要があります。その後、おそらく現在のウィンドウにするためにglutHideWindow呼び出した後、 を使用して代わりに非表示にする必要があります。glutSetWindowもう一度表示するには、 を呼び出しますglutShowWindow

glutReshapeFuncまた、やのような関数をglutKeyboardFunc複数回呼び出す必要はありません。初期化中に一度だけ実行してください。条件に応じて異なることを行う必要がある場合は、渡した関数で if を使用します。

于 2013-05-22T06:07:48.133 に答える