WPF中winforms面板中的原生OpenGL

本文关键字:原生 OpenGL winforms WPF | 更新日期: 2023-09-27 18:10:55

在我的项目中,我已经有一个本机c++库包装在c++ 'CLI中,然后在我的WPF应用程序中引用。在我的应用程序中,我有一个水色的Winforms面板显示:

        <WindowsFormsHost x:Name="openGLWF">
            <winForms:Panel x:Name="openGLPanel1"
                    Dock="Fill" 
                    BackColor="Aqua" Paint="Panel_Paint" />
        </WindowsFormsHost>

我想做的是让面板被用来从我的本地库绘制我的OpenGL内容。我四处搜索并阅读了暗示这是可能的书籍,但我找到的"解决方案"并不彻底,而且太模糊而无法实现。

注意:在被用户gbjbaanb标记为5年前回答的可能副本后,我的问题不同于他引用的"原始"处理。net 4.0和Winforms,在那里我处理。net 4.5.2和WPF,其中有一个Winforms面板。

WPF中winforms面板中的原生OpenGL

工作流程基本上与每个窗口控件或窗口相同。唯一的区别是,不需要构造hwnd,因为这已经由WinForms控件完成了。因此,在Windows-Forms控件上创建OpenGL上下文的示例可能看起来像这样(c++/CLI):

public void InitGL(System::Windows::Forms::UserControl^ userControl)
{
    HWND hwnd = (HWND)userControl->Handle.ToPointer();
    HDC hdc = GetDC(hwnd);
    //From now on everything is similar to initializing a context on any other hdc
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
          PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 24;
    int iFormat = ChoosePixelFormat(hdc, &pfd);
    SetPixelFormat(hdc, iFormat, &pfd);
    HGLRC hrc = wglCreateContext(hdc);
    wglMakeCurrent(hdc, hrc);
    //From now on we have a valid OpenGL context
    //Do other stuff like glewInit etc. now
}

请注意,这段代码与这里的代码类似,它已经链接在重复的答案建议中。