VTK 渲染成 C#

Posted

技术标签:

【中文标题】VTK 渲染成 C#【英文标题】:VTK Render into C# 【发布时间】:2015-05-18 10:42:59 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

class MyRender

//attributes
....

MyRender(HWND parent)

    renderer = vtkSmartPointer<vtkRenderer>::New();
    _render = vtkSmartPointer<vtkRenderWindow>::New();

    _render->AddRenderer(renderer);
    interactor = vtkSmartPointer<vtkRenderWindowInteractor>::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);

希望对您有所帮助。

【讨论】:

HwndSource source = (HwndSource)HwndSource.FromVisual(this); IntPtr hWnd = source.Handle; 它没有返回任何句柄。如何获得手柄? Loaded获取句柄事件处理程序确实给了non nullptrhndl

以上是关于VTK 渲染成 C#的主要内容,如果未能解决你的问题,请参考以下文章

VTK体渲染同时显示两个物体

将文件BMP链读入VTK并通过Python+QT渲染体积3d

无法使用 pvpython 渲染某些东西(paraview)

CMake编译VTK,ITK总是出错

走进电影院观看VTK

BestMPRBaseVtk-012-vtk交互器vtkRenderWindowInteractor