我正在尝试将使用可视化工具包 (VTK) 库创建的场景嵌入到 VisualC++ 2012 创建的 Windows 窗体中,以便我可以设计我的 Windows native GUI 界面。
我想强调的是,所有带有控制台应用程序的示例都是使用 (Cmake) 配置的,使用 VC++2012 编译的,并且按照官方 VTK wiki 页面的说明完美运行。
问题是,如果我尝试在 Win Form 应用程序中调用那些 VTK 函数和类初始化,我会得到 错误 LNK1107:无效或损坏的文件:无法在 0x2E0 D:\.....\VTK_61_BUILD_VS2012\bin\Debug\vtkViewsCore-6.1.dll
即使我按预期正常添加所有内容,也包括 header 和外部库依赖项。
这让我觉得我源自错误的 Visual C++ 2012 项目模板或明显我完全缺失的东西,否则编译器会出现许多未找到的文件或语法错误。
这是我尝试调用 VTK 库的第一行,即使智能感知也建议 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();
这里有什么问题?
最佳答案
当我遇到同样的问题时,以下链接(特别是bnsteel先生的回答)对我帮助很大 ==>
http://vtk.1045678.n5.nabble.com/VTK-and-Winforms-integration-td5721086.html
您可以按照链接下的建议使用 Swig。但没有必要。使用类似的方式(传递 Windows 窗体面板句柄),您可以按照 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 ..);
关于c++ - 如何在 Windows 窗体项目中创建 VTK 项目 (VisualC++ 2012),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24161640/