我使用GLUT和OpenGL创建了一个简单的Visual Studio Express 2010 C ++项目, 它编译并运行正常,但它创建的窗口没有收到任何事件。 关闭/最小化按钮不执行任何操作(甚至没有鼠标悬停)右键单击任务栏上的任何上下文菜单,如果部分覆盖,则单击时窗口不会到达前景。
项目设置为控制台应用程序,我可以通过关闭控制台来关闭程序。
我主要有这个:
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();
}
答案 0 :(得分:1)
您错过了显示回调。你能尝试一下:
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();
}
另外,如果你有效地在函数内部循环,你的空闲函数似乎很糟糕。 Glut是面向回调的。您不需要创建循环,而是依赖空闲,鼠标,键盘,显示和调整大小回调。如果你不这样做,你将会错过窗口管理器事件。
编辑:
如果要创建动画,可以使用:
glutIdleFunc(idleFunc);
void idleFunc(){
glutPostRedisplay();
}