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);
希望这有帮助。