2015-05-18 2 views
0

У меня есть приложение C++, которое использует VTK, я хочу иметь vtkRenderWindow и поместить его в проект C# WPF без использования оболочки C#.VTK Render in 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, панели Forms:

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); 

Чтобы удалить строку заголовка, просто добавьте в DLL этой C++ (после того, как будет создано окно визуализации):

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

Надеюсь, что эта помощь.