高版本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个调试函数。

最后给个运行结果