我正在尝试通过Win32 API创建一个OpenGL上下文,而不使用GLUT等包装器。我以前做了很多次,但这次我得到了两个错误之一;有时当您退出窗口时,应用程序不会结束,但几秒钟后,应用程序在调试窗口中以以下消息结束:
Palette watcher thread id 5100 possible deadlock with DLL unload, killing the palette watcher
Unable to open the palette watcher thread id 5100 for termination!
窗口关闭时有时会显示第二条消息:
PostMessage to hwnd: 00120266 failed with error: 00000578
我已经用Google搜索了这个,并且发现了一个类似问题的人似乎源于 SetupPixelFormat 。我不知道造成这种情况的原因是什么。除了OpenGL渲染上下文设置之外,我已经排除了所有其他代码的问题。
这是我的设置:
BOOL Win32Handler::CreateOpenGLContext(void)
{
int pixelFormat;
this->hdc = GetDC(this->windowHandle);
PIXELFORMATDESCRIPTOR PFD =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
24,
8,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
pixelFormat = ChoosePixelFormat(this->hdc,&PFD);
if(!SetPixelFormat(this->hdc,pixelFormat,&PFD)) return FALSE;
this->hglrc = wglCreateContext(this->hdc);
if(!this->hglrc) return FALSE;
if(!wglMakeCurrent(this->hdc,this->hglrc)) return FALSE;
glewExperimental = TRUE;
GLenum error = glewInit();
if(error != GLEW_OK) return FALSE;
return TRUE;
}
在创建窗口后,在我的main方法中调用此函数。
我知道不会创建OpenGL上下文,因为 SwapBuffers()和 glClearColor()似乎无法正常工作。
请注意,当我不打电话给设置代码时,这些错误不会发生。 这两个似乎也是随机发生的,有时当我关闭应用程序时会发生一个而不是另一个。他们从未同时触发过。
答案 0 :(得分:0)
查看代码我只能猜测设备上下文和/或窗口句柄无效。任何使设备上下文无效的行为都会出现奇怪和未定义的行为,包括程序关闭时的错误。
确保窗口句柄有效且您具有有效的设备上下文。还有一个重要的注意事项:对于每个GetDC
,您应该确保有相应的ReleaseDC。