2015-05-18 75 views

回答

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

希望得到这个帮助。