MFC中如果使用VTK
- 碎碎念
- 一、vtk环境配置
- 二、具体实现
- 1、新建类
- 2. 自定义控件
- 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,如果您有更丰富的使用经验,期待您分享给我,感激不尽。