VTK渲染成C#

我有一个使用VTK的c ++应用程序,我想拥有vtkRenderWindow并将其放入C#WPF项目而不使用C#包装器。

这样做的主要思想是将HWND设置为vtkRenderWindow的父级

以下是如何做到这一点:C ++类:

class MyRender { //attributes .... MyRender(HWND parent) { renderer = vtkSmartPointer::New(); _render = vtkSmartPointer::New(); _render->AddRenderer(renderer); interactor = vtkSmartPointer::New(); interactor->SetRenderWindow(_render); //setting background renderer->SetBackground(0.1, 0.2, 0.4); _render->SetParentId(parent); } void Render() { interactor->Initialize(); _render->Render(); } //...more methods } 

创建CLR类以包装C ++类,格式如下:

 class RenderWindows_CLR { //attributes MyRender* renderWindow; RenderWindows_CLR::RenderWindows_CLR::RenderWindows_CLR(IntPtr parent) { renderWindow = new MyRender((HWND)parent.ToPointer()); } void RenderWindows_CLR::RenderWindows_CLR::Render(IntPtr parent) { renderWindow->Render(); } } 

如何从C#中使用它:以下是如何放置Windows窗体面板的位置:

 window = new RenderWindows_CLR.RenderWindows_CLR(this.panel.Handle); window.Render() 

以下是如何使用WPF:

 HwndSource source = (HwndSource)HwndSource.FromVisual(this); IntPtr hWnd = source.Handle; window = new RenderWindows_CLR.RenderWindows_CLR(hWnd); 

要删除标题栏,只需添加到C ++ DLL(在创建渲染窗口之后):

 HWND window = (HWND)_render->GetGenericWindowId(); LONG style = GetWindowLong(window, GWL_STYLE) & ~(WS_BORDER | WS_DLGFRAME | WS_THICKFRAME); SetWindowLong(window,-16L, style); 

希望这有帮助。