2014-06-11 163 views
1

我试图将Visualization ToolKit(VTK)库创建的场景嵌入到VisualC++ 2012中创建的窗体窗体中,以便设计我的Windows本机GUI界面。如何在Windows窗体项目中创建VTK项目(VisualC++ 2012)

我想强调的是,所有使用控制台应用程序的例子都配置了(Cmake),使用VC++ 2012进行编译并按照官方VTK wiki页面的指示完美工作。

问题是,如果我尝试调用Win Form应用程序中的VTK函数和类初始化,即使我按预期方式正常添加所有内容,也会得到Error LNK1107: invalid or corrupt file: cannot read at 0x2E0 D:\.....\VTK_61_BUILD_VS2012\bin\Debug\vtkViewsCore-6.1.dll,这些包括头文件和外部库依赖项。

这让我觉得我来自错误的Visual C++ 2012项目模板或明显的东西我完全失踪,否则编译器会出现很多没有找到文件或语法错误。

这是我尝试调用VTK库的第一行,即使是intellisense也提示vtk .....名为proc,函数和结构,但应用程序无法编译。

#pragma once 

#include <vtkSmartPointer.h> 
#include <vtkTriangle.h> 
#include <vtkCellArray.h> 
#include <vtkPolyData.h> 
#include <vtkRenderWindow.h> 

namespace CLR_Project1 { 
using namespace System; 
using namespace System::ComponentModel; 
using namespace System::Collections; 
using namespace System::Windows::Forms; 
using namespace System::Data; 
using namespace System::Drawing; 
... 
... 
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); 

这里有什么问题?

+0

首先你必须创建一个CLR包装VTK或使用C++/CLR混合模式。 –

回答

1

下面的链接(尤其bnsteel先生的回答)帮了我很多,当我有同样的问题==>

http://vtk.1045678.n5.nabble.com/VTK-and-Winforms-integration-td5721086.html

您可以使用痛饮,因为它是根据建议链接。但这不是必要的。使用类似的方法(传递窗体窗体面板句柄),可以按照jalal sadeghi的建议创建一个C++/CLI包装器。您将通过包装器将面板句柄传递到执行所有“VTK工作”的C++库。这样,您不必为所有VTK类创建单独的包装器,所有“VTK工作”和VTK依赖关系都会隐藏在C++层中。

像这样的东西==>

C++侧

setImageRenderWindowParentID(void *theID){ 
     ... (init your vtk render window) 
     renWin->SetParentId(theID); 
} 

C++/CLI侧

void setRenderWindowParentID(IntPtr parentID, .. also pass the panel size ..){ 
    void* p = parentID.ToPointer(); 
    myCPPVTK->setRenderWindowParentID(p, .. also pass the panel size ..); 
} 

C#侧

VTKWrapper.setRenderWindowParentID(m_panel.Handle, .. also pass the panel size ..); 
相关问题