MFC选项卡控件中的VTK窗口

问题描述

我已经开发了一个包含标签的MFC应用程序。我需要在此标签内链接vtk窗口。这怎么可能?我已将此链接称为“ https://gitlab.kitware.com/vtk/vtk/blob/ee46f867e9bc052f38c3e51534a93aa087af9efd/Examples/GUI/Win32/SampleMFC/vtkMFCRenderView.cpp",但无法理解其逻辑。

解决方法

在标题中:

#include <vtkMFCWindow.h>
#include <vtkRenderer.h>
#include <vtkImageActor.h>

class CYourView : public CView
{
...
...
protected:
    vtkMFCWindow* m_pvtkMFCWindow;
    vtkRenderer* m_pvtkRenderer;
    vtkImageActor* m_pvtkImageActor;
...
};

在您的实现文件(cpp)中:

#include <vtkWin32OpenGLRenderWindow.h>

 CYourView::CYourView()
 {
    // TODO: add construction code here
 
    m_pvtkMFCWindow = NULL;
    m_pvtkRenderer = vtkRenderer::New();
    m_pvtkImageActor = vtkImageActor::New();
 }
 
 CYourView::~CYourView()
 {
    if(NULL != m_pvtkMFCWindow)
        delete m_pvtkMFCWindow;
 }
 
void CYourView::OnDraw(CDC* pDC)
{
    CYourDoc* 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);
}

void CYourView::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_pReader->GetOutputPort());
        m_pvtkRenderer->AddActor(m_pvtkImageActor);
//      m_pvtkRenderer->ResetCamera();
    }
}

void CYourView::OnDestroy()
{
    if(NULL != m_pvtkRenderer)
        m_pvtkRenderer->Delete();
    if(NULL != m_pvtkImageActor)
        m_pvtkImageActor->Delete();

    CView::OnDestroy();

    // TODO: Add your message handler code here
}

BOOL CYourView::OnEraseBkgnd(CDC* pDC)
{
    // TODO: Add your message handler code here and/or call default

    return TRUE;
//  return CView::OnEraseBkgnd(pDC);
}

void CYourView::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,cy);
}

此示例适用于SDI / MDI情况,但是如果需要,您可以轻松地基于CDialog。

PS 。在您的 stdafx.h 文件中,您需要插入:

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...