WPF中winforms面板中的原生OpenGL

时间:2015-09-03 09:28:17

标签: c# c++ wpf winforms opengl

在我的项目中,我已经有一个用C ++ \ CLI包装的本机C ++库,然后在我的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面板。

1 个答案:

答案 0 :(得分:0)

工作流程与每个Windows控件或窗口基本相同。唯一的区别是,一个人不必构造hwnd,因为这已经由WinForms控件完成了。因此,在Windows窗体控件上创建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
}

请注意,此代码与here类似,已在重复的答案建议中进行了链接。