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)
但以下适用于相同的 hRC:
wglMakeCurrent(hSomeWindowDC,hRC);
以上是 Windows 的 OpenGL 3.0+ 初始化系统的一部分。
为了美观,我试图避免创建一个虚拟窗口。
我以前从未使用过 CreateDC,所以也许我错过了一些东西。
编辑:hSomeWindowDC 将指向具有适当像素格式的窗口 DC。
更多信息:
我希望创建一个独立于窗口的 OpenGL 渲染上下文。
由于选择了答案,似乎我需要使用一个虚拟窗口(没什么大不了的,只是一个可以传递的句柄)。
我为什么要这样做:由于可以在同一个线程中为具有相同像素格式的多个窗口使用相同的渲染上下文,因此可以创建一个渲染上下文(实际上,只是一个与 gl 相关的对象的容器) 独立于特定窗口。通过这种方式,可以在图形和 UI 初始化之间创建一个清晰的分离。上下文的目的最初不是为了渲染(尽管我相信人们可以使用它渲染成纹理)。如果想在特定上下文中更改缓冲区的内容,只需将所需的上下文对象本身设置为当前对象(因为它带有虚拟窗口,这是可能的)。渲染到一个窗口很简单:正如上面所暗示的,窗口的 DC 只需要具有相同的像素格式。只需制作渲染上下文和窗口的直流电流,然后渲染。请注意,在撰写本文时,这个想法仍在测试中。如果这种变化(或者如果我记得:P),我会更新这篇文章。
最佳答案
我从 15 年前阅读 Petzold 得到了一个休眠的脑细胞,它刚刚恢复了生命。 CreateDC() 的 DC 受到限制。非常适合获取有关显示设备、测量值之类的信息。不适合用作常规绘画 DC。您几乎肯定需要 GetDC()。
关于c++ - CreateDC 和 wglMakeCurrent 的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3498240/