高版本vtk 的MFC显示
来源:互联网 发布:docker 查看数据库 编辑:程序博客网 时间:2024/05/24 07:05
我的vtk mfc 的实现成功的测试环境是 vtk 6.3 , vs2010.
下载地址:http://download.csdn.net/download/leon_zeng0/9941150
当我对vtk 感兴趣的时候,我就想把他应用在MFC上。我的大部分程序都是用MFC开发的。
我在网上查找,找出了很多,我就照做了,可是怎么也做不出来。发现网上的介绍都是针对vtk 5.8
版本或更低的,后来听介绍说这只是能用于vtk 5.10
前的版本。我努力寻找vtk 6
以后的版本,因为我手上的版本是6.3 和7.1。
我终于找到了,这是一个vtk 6.1
vs2008
版本上实现的,我做了测试,基本上是可以的,就和大家一起分享。
他的地址是: https://www.codeproject.com/Tips/795319/VTK-in-MFC
我能做成功,主要是借助了他的工程和介绍。但他的介绍不是很详细,下载的工程需要变更才能编译成功。
那我下面就介绍怎么做。先做一个mfc
的工程,这里是一个多文档的实现例子,去掉工程等非源码的文件,建立一个cmakelists文件,文件内容如下:
#CMakeLists.txt
cmake_minimum_required(VERSION 3.7.2)
project(vtkMFC)
find_package(VTK)
if(VTK_FOUND)
include(${VTK_USE_FILE})
else(VTK_FOUND)
message(FATAL_ERROR "cannot bulid without vtk")
endif(VTK_FOUND)
#添加工程文件
#两部分:代码文件 后续类文件
set(PROJECT_SRCS
stdafx.h
stdafx.cpp
Resource.h
targetver.h
vtkMFC.cpp
vtkMFC.h
vtkMFC.rc
MainFrm.cpp
MainFrm.h
vtkMFCDoc.cpp
vtkMFCDoc.h
vtkMFCView.cpp
vtkMFCView.h
res/vtkMFC.ico
res/vtkMFC.rc2
res/vtkMFCDoc.ico
res/ToolBar.bmp
res/ToolBar256.bmp
)
#配置工程的模块
include("${VTK_DIR}/GUISupport/MFC/VTKMFCSettings.cmake")
set(VTK_LIBS ${VTK_LIBRARIES}
)
add_executable(vtkMFC WIN32 ${PROJECT_SRCS})
target_link_libraries(vtkMFC ${VTK_LIBS})
用cmake
形成你的vs工程 ,我形成的是vs2010下的工程。
然后对5个文件进行修改。std.h, doc.h, doc.cpp view.h view.cpp
std.h 的修改是添加:
//#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
//#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);
注释掉的是原文内容,但编译不过,
下面是我的修改
doc.h的修改:
#include <vtkBMPReader.h>
class CTestBMPDoc : public CDocument
{
。。。
// Attributes
public:
vtkBMPReader* m_pvtkBMPReader;
。。。
}
doc.cpp 的修改:
#include <vtkStringArray.h>
CTestBMPDoc::CTestBMPDoc()
{
// TODO: add one-time construction code here
m_pvtkBMPReader = NULL;
}
BOOL CTestBMPDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (! CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: Add your specialized creation code here
m_pvtkBMPReader = vtkBMPReader::New();
///*////////////////////////////////////////////////
m_pvtkBMPReader->SetFileName(lpszPathName);
/*////////////////////////////////////////////////
vtkStringArray* pArr = vtkStringArray::New();
pArr->SetNumberOfValues(4);
pArr->SetValue(0, _T("D:/Tempx/BmpSerie1/bmp1.bmp"));
pArr->SetValue(0, _T("D:/Tempx/BmpSerie1/bmp2.bmp"));
pArr->SetValue(0, _T("D:/Tempx/BmpSerie1/bmp3.bmp"));
pArr->SetValue(0, _T("D:/Tempx/BmpSerie1/bmp4.bmp"));
m_pvtkBMPReader->SetFileNames(pArr);
pArr->Delete();
///*////////////////////////////////////////////////
return TRUE;
}
void CTestBMPDoc::OnCloseDocument()
{
// TODO: Add your specialized code here and/or call the base class
if(NULL != m_pvtkBMPReader)
m_pvtkBMPReader->Delete();
CDocument::OnCloseDocument();
}
view.h 的修改
//#include <vtkGUISupportMFCModule.h>
#include <vtkMFCWindow.h>
#include <vtkRenderer.h>
#include <vtkImageActor.h>
class CTestBMPView : public CView
{
。。。
protected:
vtkMFCWindow* m_pvtkMFCWindow;
vtkRenderer* m_pvtkRenderer;
vtkImageActor* m_pvtkImageActor;
public:
afx_msg void OnDestroy();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual void OnInitialUpdate();
protected:
// virtual void OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/);
};
view.cpp的修改
#include <vtkWin32OpenGLRenderWindow.h>
#include <vtkImageMapper3D.h>
// CTestBMPView construction/destruction
CTestBMPView::CTestBMPView()
{
// TODO: add construction code here
m_pvtkMFCWindow = NULL;
m_pvtkRenderer = vtkRenderer::New();
m_pvtkImageActor = vtkImageActor::New();
}
CTestBMPView::~CTestBMPView()
{
if(NULL != m_pvtkMFCWindow)
delete m_pvtkMFCWindow;
}
// CTestBMPView drawing
void CTestBMPView::OnDraw(CDC* pDC)
{
CTestBMPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
if(NULL != m_pvtkMFCWindow && pDC->IsPrinting())
m_pvtkMFCWindow->DrawDC(pDC);
}
// CTestBMPView message handlers
void CTestBMPView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
m_pvtkMFCWindow = new vtkMFCWindow(this);
m_pvtkMFCWindow->GetRenderWindow()->AddRenderer(m_pvtkRenderer);
m_pvtkRenderer->SetBackground(0.0, 0.0, 0.5);
if(NULL != GetDocument()->m_pvtkBMPReader)
{
//setup renderer
m_pvtkImageActor->GetMapper()->SetInputConnection(GetDocument()->m_pvtkBMPReader->GetOutputPort());
m_pvtkRenderer->AddActor(m_pvtkImageActor);
// m_pvtkRenderer->ResetCamera();
}
}
void CTestBMPView::OnDestroy()
{
if(NULL != m_pvtkRenderer)
m_pvtkRenderer->Delete();
if(NULL != m_pvtkImageActor)
m_pvtkImageActor->Delete();
CView::OnDestroy();
// TODO: Add your message handler code here
}
void CTestBMPView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(NULL != m_pvtkMFCWindow)
m_pvtkMFCWindow->MoveWindow(0, 0, cx, cy);
}
所有源代码和cmakelist 可以在csdn 下载,或者留下联系方式直接给你
也欢迎你提出你的问题,我将积极解答。
在debug 版本的编译链接会有问题,但其他的版本都好
错误提示是:
1>vtkMFCView.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall vtkMFCWindow::AssertValid(void)const " (?AssertValid@vtkMFCWindow@@UBEXXZ)
1>vtkMFCView.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall vtkMFCWindow::Dump(class CDumpContext &)const " (?Dump@vtkMFCWindow@@UBEXAAVCDumpContext@@@Z)
1>C:\dxf\opencv\vtkMFC\bin\Debug\vtkMFC.exe : fatal error LNK1120: 2 unresolved externals
查看了vtkMFCWindow.h
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
我没有编译链接vtk 的debug 版本,所以库里没有包含那2个调试函数。
最后给个运行结果
- 高版本vtk 的MFC显示
- VTK嵌入MFC同步显示
- 把pcl的VTK显示融合到MFC
- VTK+MFC:建立自定义控件显示
- 编译VTK的MFC库
- VTK+MFC
- VTK点云的显示
- 基于VTK的MFC应用程序开发(1)
- 基于VTK的MFC应用程序开发(2)
- 基于VTK的MFC应用程序开发(3)
- 基于VTK的MFC应用程序开发(一)
- 基于VTK的MFC应用程序开发(3)
- 基于VTK的MFC应用程序开发(1)
- 基于VTK的MFC应用程序开发(2)
- 基于VTK的MFC应用程序开发(3)
- 基于VTK的MFC应用程序开发(3)
- 基于VTK的MFC应用程序开发(1)
- 基于VTK的MFC应用程序开发(2)
- 使用vue中路由router-link中包含a标签
- Linux下的.so文件编写
- 【事件绑定的方式】兼容浏览器的事件监听器的设计
- 【HDU6146】【2017百度之星复赛-C】Pokémon GO(动态规划)(dp)
- DQN起源,原理,核心理解
- 高版本vtk 的MFC显示
- java 打印流(PrintStream,PrintWriter)
- POJ 1163 The Triangle
- Java 发送邮件
- 配置php
- Yii session 和 cookie
- mysql日志满了 mysqld_safe
- Log4j,Log4j2,logback,slf4j日志学习
- 关于执行文件路径的变量 $PATH