C++ OpenGL上下文创建失败
我试图通过Win32 API创建一个OpenGL上下文,而不使用GLUT这样的包装器。我以前做过很多次,但这次我犯了两个错误中的一个;有时,当您退出窗口时,应用程序不会结束,但几秒钟后,应用程序在调试窗口中以以下消息结束:C++ OpenGL上下文创建失败,c++,opengl,C++,Opengl,我试图通过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
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
我已经在谷歌上搜索过了,其中一个人发现了一个类似的问题,这个问题似乎源于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()似乎不起作用
请注意,当我不调用设置代码时,这些错误不会发生。
另外,这两种情况似乎是随机发生的,有时当我关闭应用程序时,一种情况发生了,而另一种情况没有发生。它们从未同时触发。查看代码,我只能猜测设备上下文和/或窗口句柄无效。任何接受无效设备上下文的内容都可能表现出奇怪和未定义的行为,包括程序关闭时的错误
确保窗口句柄有效,并且具有有效的设备上下文。还有一个重要的注意事项:对于每个
GetDC
,您应该确保有一个相应的ReleaseDC。明显的问题是,您是否确定GetDC(此->窗口句柄)
返回的内容有效?(即窗口句柄是否有效?)。我想知道在这一点上是否有一个有效的设备上下文设置?我的意见是一个坏的DC可能会导致这种情况。我刚刚检查了windowHandle,它似乎确实无效。我不确定这是怎么可能的,因为我刚刚在窗口创建函数中检查了windowHandle的值,它是有效的!OpenGL设置调用直接在窗口设置之后进行。我可能需要看一些创建窗口的代码。确实使用创建时的HWND设置了windowHandle变量吗?必须在创建和此函数之间发生某些事情才能导致该行为。我推测这是严格意义上的C++/Win32(以及Wrangler库)代码(没有MFC/ATL等)?请问什么是编译器和开发环境?如果您愿意,您可以随时使用更多代码编辑您的问题。好的,谢谢您的帮助!我将在上面发布我的窗口创建代码,但我确实找到了它。我将上下文创建函数移动到WM_CREATE下的消息循环中。因此,在创建窗口之后,我使用传递到消息循环中的HWND,并用该HWND替换了windowHandle,现在可以正常工作了。这完全是Visual Studio 2012中的C++/Win32。无需发布更多代码。我将发布一个实际的答案,一个必须有一个有效的设备上下文,否则将发生未定义的行为。我推荐的一件事是,如果您使用GetDC,您也需要在某个地方使用相应的ReleaseDC。我很高兴你至少已经克服了这个错误。