Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Win32(C+;+;)静态控件中正确呈现OpenGL?_C++_Winapi_Opengl - Fatal编程技术网

C++ 如何在Win32(C+;+;)静态控件中正确呈现OpenGL?

C++ 如何在Win32(C+;+;)静态控件中正确呈现OpenGL?,c++,winapi,opengl,C++,Winapi,Opengl,我正试图让OpenGL在Win32 api静态控件中进行渲染。我已经阅读了Nehe关于如何强制openGl渲染整个窗口的教程()。我知道如何做到这一点,但我不完全确定如何让它在静态控件(或任何控件)内部渲染。目前,我正在尝试这样做: HDC hDC = NULL; HGLRC hRC = NULL; HWND hWnd = NULL; HWND panel; HINSTANCE hInstance; void CreatePan

我正试图让OpenGL在Win32 api静态控件中进行渲染。我已经阅读了Nehe关于如何强制openGl渲染整个窗口的教程()。我知道如何做到这一点,但我不完全确定如何让它在静态控件(或任何控件)内部渲染。目前,我正在尝试这样做:

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);
}

我有比这更多的代码,但我认为这是唯一重要的部分。如果你想让我发布更多,请告诉我。回调函数被大量缩减,CreatePanelGL()函数是一个完整的复制粘贴函数。该代码几乎是Nehe代码的一个经过大量修改的版本。虽然这不会引发任何错误,但openGl不会渲染面板内部的清晰颜色。有人能帮我吗?我肯定我至少做错了一百件事。

静态控件有自己的绘图操作,可能会把事情搞砸。创建一个自定义子窗口。

必须尝试对控件进行子类化并覆盖其绘制消息,而不在其中执行任何操作或使用OpenGL在其中绘制?@Calvin:我将看看如何使用自定义控件@Brandon:现在我只使用颜色清除OpenGL,我没有对控件绘制消息执行任何操作。我该怎么做呢?谢谢你的意见。我查阅了制作自定义控件,并设法找到了一些c语言的示例代码。我知道如何做到这一点,但我仍然对如何让OpenGl融入其中感到困惑。我假设我会有一个新的控件类,它有自己的注册、取消注册和回调函数。在回调函数中,我假设我需要在回调函数中接管WM_PAINT,但我不明白我该怎么做。你能更深入地回答这个问题吗?我不打算在这里详细讨论,你应该找到一个关于这个问题的教程。谷歌它,或访问。不,NeHe,它很好,但现在它被认为是严重过时的古GL版本。我之所以问它,是因为我找不到一个教程,我正在尝试做什么。该网站也没有关于我尝试做什么的教程,也没有与Win32 api或控件相关的内容。再多了解一些细节就好了。