C++ CreateDC和wglMakeCurrent存在问题

C++ CreateDC和wglMakeCurrent存在问题,c++,windows,opengl,gdi,C++,Windows,Opengl,Gdi,但以下内容适用于相同的hRC: PIXELFORMATDESCRIPTOR pfd = { /* otherwise fine for a window with 32-bit color */ }; HDC hDC = CreateDC(TEXT("Display"),NULL,NULL,NULL); // always OK int ipf = ChoosePixelFormat(hDC,&pfd); // always OK SetPixelFormat(hDC,ipf,&pfd

但以下内容适用于相同的hRC:



PIXELFORMATDESCRIPTOR pfd = { /* otherwise fine for a window with 32-bit color */ };

HDC hDC = CreateDC(TEXT("Display"),NULL,NULL,NULL); // always OK

int ipf = ChoosePixelFormat(hDC,&pfd); // always OK

SetPixelFormat(hDC,ipf,&pfd); // always OK

HGLRC hRC = wglCreateContext(hDC); // always OK

wglMakeCurrent(hDC,hRC); // ! read error: 0xbaadf039 (debug, obviously)
以上是OpenGL 3.0+Windows初始化系统的一部分。

为了美观起见,我尽量避免创建虚拟窗口。

我以前从未使用过CreateDC,所以可能我错过了一些东西。

编辑:hSomeWindowDC将指向具有适当像素格式的窗口DC。



更多信息:

我希望创建一个独立于窗口的OpenGL渲染上下文。

由于选择了答案,我似乎需要使用一个虚拟窗口(其实没什么大不了的,只是一个句柄来传递信息)。


为什么我要这样做:由于可以在同一线程中对多个具有相同像素格式的窗口使用相同的渲染上下文,因此可以创建独立于特定窗口的渲染上下文(实际上,只是gl相关对象的容器)。通过这种方式,可以在图形和UI初始化之间创建一个清晰的分隔。

上下文最初的目的不是渲染(尽管我相信可以使用它渲染为纹理)。如果要在特定上下文中更改缓冲区的内容,只需将所需的上下文对象本身设置为当前对象(因为它携带虚拟窗口,这是可能的)。渲染到窗口很简单:如上所述,窗口的DC只需要具有相同的像素格式。只需将渲染上下文和窗口的DC设置为当前,然后进行渲染。

请注意,在撰写本文时,此想法仍在测试中。如果这种情况发生变化,我会更新这篇文章(或者如果我记得的话:P)。

我15年前读过《佩佐尔德》时,发现了一个休眠的脑细胞,它刚刚复活。来自CreateDC()的DC受到限制。很适合获取有关显示设备、测量之类的信息。不适合用作普通的涂装DC。您几乎肯定需要GetDC()。

我当前的OpenGL 3+初始化例程不需要虚拟窗口。您可以简单地尝试创建第二个RC,并使用实际窗口的DC使其成为当前RC。看看OpenGL wiki

0xbaadf039
看起来非常接近
0xbaadf00d
——调试器经常用它来填充未初始化的空间,以使其明显表明它们还不应该被使用。是的,因此关于调试的俏皮话就在它旁边。奇怪的是,我没有对句柄做任何操作,也没有事先执行任何分配。GetLastError返回什么?为什么不能使用普通窗口呢?读取错误是运行时异常。我不打算将原始块解释为源代码的单个片段。我对它进行了编辑,应该更加清楚地强调第二部分是一个单独的例子。谢谢!在所有Windows“通用对象句柄”范例没有记录的模糊事物中,有人认为任何DC都可以用于此目的。你能提到你在那本书中找到这个的部分吗?我这样问是因为我在读了你的答案后才打开了那本书,它看起来非常接近于函数的描述,这与CreateDC在同一节中提到的,即“获取设备上下文句柄”。谢谢你的回答。我忘了提到,我正在尝试创建一个上下文系统,它不会将自身附加到窗口,因为这会导致更干净的初始化序列(主要是为了进一步将图形与UI本身分离)。然而,我多次发现wiki是一个有价值的文档。可能吗?如果你能想出一个解决方案,你能用它更新你的问题吗?我对它很感兴趣。我的问题已经更新为解决方案的解释。唯一的问题是你不能用这种方式创建多采样窗口,而是需要使用多采样FBO并从FBO解析到窗口。

wglMakeCurrent(hSomeWindowDC,hRC);