如何在 Win32(C++) 静态控件中正确呈现 OpenGL?
How do I properly render OpenGL inside of a Win32(C++) static control?
我正在尝试让 OpenGL 在 Win32 api 静态控件中呈现。我已经阅读了 Nehe 的教程 (http://nehe.gamedev.net/tutorial/creating_an_opengl_window_%28win32%29/13001/),了解如何强制 openGl 渲染整个 window。我知道如何做到这一点,但我不完全确定如何让它在静态控件(或任何控件)内呈现。目前,我正在尝试这样做:
HDC hDC = NULL;
HGLRC hRC = NULL;
HWND hWnd = NULL;
HWND panel;
HINSTANCE hInstance;
void CreatePanelGL(HWND hWnd){
panel = CreateWindowEx(
WS_EX_CLIENTEDGE,
"STATIC",
"",
WS_CHILDWINDOW | WS_VISIBLE | CS_OWNDC | CS_VREDRAW | CS_HREDRAW,
30, 30, 100, 100,
hWnd,
(HMENU)BUTTON_ID,
GetModuleHandle(NULL),
NULL);
hDC = GetDC(panel);
PIXELFORMATDESCRIPTOR pfd = { 0 };
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 16;
pfd.cStencilBits = 8;
SetPixelFormat(hDC, 1, &pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
switch(uMsg){
case WM_CREATE:{
CreatePanelGL(hWnd);
break;
}}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
我有比这更多的代码,但我认为这是唯一重要的部分。如果你想让我 post 更多,请告诉我。回调函数被删减了很多,CreatePanelGL()函数是完整的复制粘贴。该代码几乎是 Nehe 代码的大量修改版本。虽然这不会引发任何错误,但 openGl 不会在面板内部呈现清晰的颜色。谁能帮我吗?我确定我至少做错了一百件事。
Static control
有自己的绘图操作,可能会把事情搞砸。而是创建一个自定义子项 window。
我正在尝试让 OpenGL 在 Win32 api 静态控件中呈现。我已经阅读了 Nehe 的教程 (http://nehe.gamedev.net/tutorial/creating_an_opengl_window_%28win32%29/13001/),了解如何强制 openGl 渲染整个 window。我知道如何做到这一点,但我不完全确定如何让它在静态控件(或任何控件)内呈现。目前,我正在尝试这样做:
HDC hDC = NULL;
HGLRC hRC = NULL;
HWND hWnd = NULL;
HWND panel;
HINSTANCE hInstance;
void CreatePanelGL(HWND hWnd){
panel = CreateWindowEx(
WS_EX_CLIENTEDGE,
"STATIC",
"",
WS_CHILDWINDOW | WS_VISIBLE | CS_OWNDC | CS_VREDRAW | CS_HREDRAW,
30, 30, 100, 100,
hWnd,
(HMENU)BUTTON_ID,
GetModuleHandle(NULL),
NULL);
hDC = GetDC(panel);
PIXELFORMATDESCRIPTOR pfd = { 0 };
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 16;
pfd.cStencilBits = 8;
SetPixelFormat(hDC, 1, &pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
switch(uMsg){
case WM_CREATE:{
CreatePanelGL(hWnd);
break;
}}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
我有比这更多的代码,但我认为这是唯一重要的部分。如果你想让我 post 更多,请告诉我。回调函数被删减了很多,CreatePanelGL()函数是完整的复制粘贴。该代码几乎是 Nehe 代码的大量修改版本。虽然这不会引发任何错误,但 openGl 不会在面板内部呈现清晰的颜色。谁能帮我吗?我确定我至少做错了一百件事。
Static control
有自己的绘图操作,可能会把事情搞砸。而是创建一个自定义子项 window。