MFC 选项卡控件中的 VTK window
VTK window in MFC tab control
我开发了一个包含选项卡的 MFC 应用程序。我需要 link 此选项卡内的 vtk window。这怎么可能?我已经提到了这个 link " https://gitlab.kitware.com/vtk/vtk/blob/ee46f867e9bc052f38c3e51534a93aa087af9efd/Examples/GUI/Win32/SampleMFC/vtkMFCRenderView.cpp" 但无法理解其中的逻辑。
在你的header中:
#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, 0, cx, cy);
}
此示例适用于 SDI/MDI 情况,但如果需要,您可以轻松地在基于 CDialog 的基础上进行调整。
P.S. 在您的 stdafx.h 文件中,您需要插入:
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
我开发了一个包含选项卡的 MFC 应用程序。我需要 link 此选项卡内的 vtk window。这怎么可能?我已经提到了这个 link " https://gitlab.kitware.com/vtk/vtk/blob/ee46f867e9bc052f38c3e51534a93aa087af9efd/Examples/GUI/Win32/SampleMFC/vtkMFCRenderView.cpp" 但无法理解其中的逻辑。
在你的header中:
#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, 0, cx, cy);
}
此示例适用于 SDI/MDI 情况,但如果需要,您可以轻松地在基于 CDialog 的基础上进行调整。
P.S. 在您的 stdafx.h 文件中,您需要插入:
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)