开发者

Problem with CreateDC and wglMakeCurrent

开发者 https://www.devze.com 2023-01-11 16:24 出处:网络
PIXELFORMATDESCRIPTOR pfd = { /* otherwise fine for a window with 32-bit color */ }; HDC hDC = CreateDC(TEXT(\"Display\"),NULL,NULL,NULL); // always OK


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)

But the following works with the same hRC:


wglMakeCurrent(hSomeWindowDC,hRC);

The above is part of an OpenGL 3.0+ initialization system for Windows.

I am trying to avoid creating a dummy window for the sake of aesthetics.

I have never used CreateDC before, so perhaps I've missed something.

edit: hSomeWindowDC would point to a window DC with an appropriate pixel format.

More info:

I wish to 开发者_运维知识库create a window-independent OpenGL rendering context.

Due to the answer selected, it seems I need to use a dummy window (not really a big deal, just a handle to pass around all the same).

Why I would want to do this: Since it is possible to use the same rendering context for multiple windows with the same pixel format in the same thread, it is possible to create a rendering context (really, just a container for gl-related objects) that is independent of a particular window. In this way, one can create a clean separation between the graphics and UI initializations.

The purpose of the context initially isn't for rendering (although I believe one could render into textures using it). If one wanted to change the contents of a buffer within a particular context, the desired context object itself would just need to be made current (since it's carrying the dummy window around with it, this is possible). Rendering into a window is simple: As implied by the above, the window's DC only needs to have the same pixel format. Simply make the rendering context and the window's DC current, and render.

Please note that, at the time of this writing, this idea is still in testing. I will update this post should this change (or if I can remember :P ).


I've got a dormant brain cell from reading Petzold 15 years ago that just sprang back to life. The DC from CreateDC() is restricted. Good for getting info about the display device, measurement, that sort of stuff. Not good to use as a regular painting DC. You almost certainly need GetDC().


My current OpenGL 3+ initialization routine doesn't require a dummy window. You can simply attempt to make a second RC and make it current using the DC of the real window. Take a look at the OpenGL wiki Tutorial: OpenGL 3.1 The First Triangle (C++/Win)

0

精彩评论

暂无评论...
验证码 换一张
取 消