Окно Win7 GLUT не принимает события - PullRequest
0 голосов
/ 09 марта 2011

Я создал простой проект Visual Studio Express 2010 C ++, используя GLUT и OpenGL, он компилируется и работает нормально, за исключением того, что создаваемое окно не получает никаких событий .. кнопки закрытия / сворачивания ничего не делают (даже при наведении курсора мыши) без контекстного меню на панели задач при щелчке правой кнопкой мыши, и окно не выходит на передний план при нажатии, если оно частично закрыто.

Проект настроен как консольное приложение, я могу закрыть программу, закрыв консоль.

У меня есть это в основном:

int main(int argc, char** argv) 
{
    glutInit(&argc, argv);
    glutInitWindowSize(window_width, window_height);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("MyApp");
    glutIdleFunc(main_loop_function);


    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
      /* Problem: glewInit failed, something is seriously wrong. */
      fprintf(stderr, "Error: %s\n", glewGetErrorString(err));

    }
    if (GLEW_VERSION_1_3)
    {
      fprintf(stdout, "OpenGL 1.3 is supported \n");
    }
    fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));



    GL_Setup(window_width, window_height);
    glutMainLoop();
}

1 Ответ

1 голос
/ 10 марта 2011

Вы пропускаете обратный вызов дисплея. Не могли бы вы попробовать:

void display();

int main(int argc, char** argv) 
{
    glutInit(&argc, argv);
    glutInitWindowSize(window_width, window_height);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("MyApp");
    /// glutIdleFunc(main_loop_function);
    glutDisplayFunc(display);

    // ...

    glutMainLoop();
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glutSwapBuffers();
}

Кроме того, ваша функция простоя кажется плохой, если вы эффективно выполняете цикл внутри этой функции. Переизбыток ориентирован на обратный вызов. Вам не нужно создавать цикл, а полагаться на обратные вызовы бездействия, мыши, клавиатуры, отображения и изменения размера Если вы этого не сделаете, вы пропустите события менеджера окон.

EDIT:

Если вы хотите создать анимацию, вы можете использовать:

glutIdleFunc(idleFunc);

void idleFunc(){
    glutPostRedisplay();
}
...