Bootstrap

【VTK】MFC中使用VTK9.3


碎碎念

如果不是老程序用的MFC,我才不想用MFC去使用VTK呢。

一、vtk环境配置

关于环境配置你可以看这篇文章,在这里不过多赘述。需要注意要选择支持MFC,默认是不支持的。
在这里插入图片描述

二、具体实现

创建一个基于对话框的MFC项目,然后设置好vtk的环境

1、新建类

新建一个VtkView类,让其继承CStatic类

#pragma once
#include <vtkRenderer.h>
#include <vtkAutoInit.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
class VtkView : public CStatic
{
private:
	CRect m_rect;
	vtkNew<vtkRenderer> ren1;
	vtkNew<vtkRenderWindow> renWin;
	vtkNew<vtkRenderWindowInteractor> iren;
	void VtkView::PreSubclassWindow()
	{
		GetClientRect(&m_rect);
		renWin->SetParentId(this->m_hWnd);
		renWin->SetSize(m_rect.Width(), m_rect.Height());
		renWin->AddRenderer(ren1);
		if (renWin->GetInteractor() == nullptr)
		{
			
			iren->SetRenderWindow(renWin);
			iren->Initialize();
		}
		CStatic::PreSubclassWindow();
		
	}
};


   

2. 自定义控件

切换至资源视图,ctrl+a 删除默认控件,在窗口中加入picture Control
在这里插入图片描述

在这里插入图片描述
修改控件id为vtk_view, 为其添加一个变量,变量类型设置为VtkView(就是我们添加的类),名称随意
在这里插入图片描述
不要忘了添加#include "VtkView.h"来解决未知类型问题。
此时点击运行,会出现找不到dll问题,直接将vtk目录的bin文件夹下所有文件复制到项目根目录即可解决问题
在这里插入图片描述
再次点击运行,运行成功
在这里插入图片描述

3、跑个栗子

例子地址

#pragma once
#include <vtkRenderer.h>
#include <vtkAutoInit.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkNamedColors.h>
#include <vtkCylinderSource.h>
#include <vtkProperty.h>
#include <vtkPolyDataMapper.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
class VtkView : public CStatic
{
private:
	CRect m_rect;
	vtkNew<vtkRenderer> ren1;
	vtkNew<vtkRenderWindow> renWin;
	vtkNew<vtkRenderWindowInteractor> iren;
	void VtkView::PreSubclassWindow()
	{
		GetClientRect(&m_rect);
		renWin->SetParentId(this->m_hWnd);
		renWin->SetSize(m_rect.Width(), m_rect.Height());
		renWin->AddRenderer(ren1);
		if (renWin->GetInteractor() == nullptr)
		{
			
			iren->SetRenderWindow(renWin);
			iren->Initialize();
		}
		vtkNew<vtkNamedColors> colors;
		std::array<unsigned char, 4> bkg{ {26, 51, 102, 255} };
		colors->SetColor("BkgColor", bkg.data());
		vtkNew<vtkCylinderSource> cylinder;
		cylinder->SetResolution(8);
		vtkNew<vtkPolyDataMapper> cylinderMapper;
		cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
		vtkNew<vtkActor> cylinderActor;
		cylinderActor->SetMapper(cylinderMapper);
		cylinderActor->GetProperty()->SetColor(
			colors->GetColor4d("Tomato").GetData());
		cylinderActor->RotateX(30.0);
		cylinderActor->RotateY(-45.0);
		ren1->AddActor(cylinderActor);
		ren1->SetBackground(colors->GetColor3d("BkgColor").GetData());
		renWin->Render();
		CStatic::PreSubclassWindow();
		
	}
};

运用结果:
在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了MFC下如何使用VTK,如果您有更丰富的使用经验,期待您分享给我,感激不尽。

;