问题与CreateDC和wglMakeCurrent

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+初始化系统的一部分。

我试图避免为了美观而创build一个虚拟的窗口。

我之前从未使用过CreateDC,所以也许我错过了一些东西。

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

更多信息:

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

由于select的答案,似乎我需要使用一个虚拟窗口(不是一个真正的大交易,只是一个句柄传递所有相同的)。

为什么我会这么做:因为可以在同一个线程中为相同像素格式的多个窗口使用相同的渲染上下文,所以可以创build一个渲染上下文(实际上,只是gl相关对象的容器)独立于特定的窗口。 通过这种方式,可以在graphics和UI初始化之间创build一个干净的分隔。

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

请注意,在撰写本文时,这个想法还在testing中。 我会更新这个post,如果这个变化(或者如果我能记得:P)。

Solutions Collecting From Web of "问题与CreateDC和wglMakeCurrent"

15年前,我读了Petzold的一个休眠的脑细胞,刚刚起死回生。 来自CreateDC()的DC受到限制。 很好的获取有关显示设备,测量,这种东西的信息。 不好使用作为一个常规绘画DC。 你几乎肯定需要GetDC()。

我目前的OpenGL 3+初始化例程不需要虚拟窗口。 您可以简单地尝试使用真实窗口的DC来制作第二个RC,并使其处于当前状态。 看看OpenGL维基教程:OpenGL 3.1第一个三角形(C ++ / Win)