如何在Windows窗体项目(visualc++ 2012)中创建VTK项目

How to create a VTK project in Windows Form Project (VisualC++ 2012 )

本文关键字:项目 2012 VTK 创建 visualc++ Windows 窗体      更新时间:2023-10-16

我试图将可视化工具包(VTK)库嵌入到visualc++ 2012创建的windows窗体中,以便我可以设计我的windows本机GUI界面。

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

问题是,如果我尝试调用那些VTK函数和类初始化在Win Form应用程序我得到Error LNK1107: invalid or corrupt file: cannot read at 0x2E0 D:.....VTK_61_BUILD_VS2012binDebugvtkViewsCore-6.1.dll即使我添加一切正常如预期,包括头和外部库依赖。

这让我认为我起源于错误的Visual c++ 2012项目模板或我完全缺失的一些明显的东西,否则编译器会产生许多未找到的文件或语法错误。

这是我试图调用VTK库的第一行,甚至智能感知建议VTK .....命名进程、函数和结构,但应用程序无法编译。

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

这里有什么问题?

当我遇到同样的问题时,下面的链接(特别是Mr. bnsteel的回答)对我帮助很大==>

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

您可以按照链接下的建议使用Swig。但这是不必要的。使用类似的方法(传递windows窗体面板句柄),你可以像jalal sadeghi建议的那样创建一个c++/CLI包装器。您将通过包装器将面板句柄传递给您的c++库,该库执行所有"VTK工作"。这样,您就不必为所有VTK类创建单独的包装器,所有的"VTK工作"和对VTK的依赖关系都隐藏在您的c++层中。

像这样==>

c++ side

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# side

 VTKWrapper.setRenderWindowParentID(m_panel.Handle, .. also pass the panel size ..);