CreateDC和wglMakeCurrent的问题

时间:2010-08-16 23:33:59

标签: c++ windows opengl gdi



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),我会更新这篇文章。

2 个答案:

答案 0 :(得分:3)

我15年前从Petzold读过一个休眠的脑细胞,刚刚恢复生机。 CreateDC()的DC受到限制。有助于获取有关显示设备,测量,那种东西的信息。不适合用作常规油画DC。你几乎肯定需要GetDC()。

答案 1 :(得分:1)

我当前的OpenGL 3+初始化例程不需要虚拟窗口。您可以简单地尝试使用真实窗口的DC创建第二个RC并使其成为当前RC。看一下OpenGL wiki Tutorial: OpenGL 3.1 The First Triangle (C++/Win)