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面板。
工作流程基本上与每个窗口控件或窗口相同。唯一的区别是,不需要构造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
}
请注意,这段代码与这里的代码类似,它已经链接在重复的答案建议中。