You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
5.9 KiB
234 lines
5.9 KiB
2 years ago
|
// vtkMFCRenderView.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "vtkMFCRenderView.h"
|
||
|
|
||
|
#include "vtkMFCDocument.h"
|
||
|
|
||
|
#include "vtkRenderer.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// vtkMFCRenderView
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(vtkMFCRenderView, vtkMFCView)
|
||
|
|
||
|
vtkMFCRenderView::vtkMFCRenderView()
|
||
|
{
|
||
|
this->Renderer = vtkRenderer::New();
|
||
|
this->RenderWindow = vtkWin32OpenGLRenderWindow::New();
|
||
|
this->RenderWindow->AddRenderer(this->Renderer);
|
||
|
this->Interactor = vtkWin32RenderWindowInteractor::New();
|
||
|
}
|
||
|
|
||
|
vtkMFCRenderView::~vtkMFCRenderView()
|
||
|
{
|
||
|
if (this->Interactor)
|
||
|
{
|
||
|
this->Interactor->Delete();
|
||
|
}
|
||
|
if (this->Renderer)
|
||
|
{
|
||
|
this->Renderer->SetRenderWindow(NULL);
|
||
|
}
|
||
|
if (this->RenderWindow)
|
||
|
{
|
||
|
this->RenderWindow->Delete();
|
||
|
}
|
||
|
if (this->Renderer)
|
||
|
{
|
||
|
this->Renderer->Delete();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(vtkMFCRenderView, vtkMFCView)
|
||
|
//{{AFX_MSG_MAP(vtkMFCRenderView)
|
||
|
ON_WM_CREATE()
|
||
|
ON_WM_SIZE()
|
||
|
//}}AFX_MSG_MAP
|
||
|
ON_COMMAND(ID_FILE_PRINT, vtkMFCRenderView::OnFilePrint)
|
||
|
ON_COMMAND(ID_FILE_PRINT_DIRECT, vtkMFCRenderView::OnFilePrint)
|
||
|
ON_COMMAND(ID_FILE_PRINT_PREVIEW, vtkMFCRenderView::OnFilePrintPreview)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// vtkMFCRenderView drawing
|
||
|
|
||
|
void vtkMFCRenderView::OnDraw(CDC* pDC)
|
||
|
{
|
||
|
CDocument* pDoc = GetDocument();
|
||
|
ASSERT_VALID(pDoc);
|
||
|
|
||
|
if (!this->Interactor->GetInitialized())
|
||
|
{
|
||
|
this->Interactor->SetRenderWindow(this->RenderWindow);
|
||
|
WNDPROC OldProc = (WNDPROC)GetWindowLong(this->m_hWnd,GWL_WNDPROC);
|
||
|
this->Interactor->Initialize();
|
||
|
SetWindowLong(this->m_hWnd,GWL_WNDPROC,(LONG)OldProc);
|
||
|
}
|
||
|
|
||
|
// TODO: add draw code for native data here
|
||
|
if (pDC->IsPrinting())
|
||
|
{
|
||
|
int size[2];
|
||
|
float scale;
|
||
|
|
||
|
BeginWaitCursor();
|
||
|
memcpy(size,this->RenderWindow->GetSize(),sizeof(int)*2);
|
||
|
|
||
|
int cxDIB = size[0]; // Size of DIB - x
|
||
|
int cyDIB = size[1]; // Size of DIB - y
|
||
|
CRect rcDest;
|
||
|
|
||
|
// get size of printer page (in pixels)
|
||
|
int cxPage = pDC->GetDeviceCaps(HORZRES);
|
||
|
int cyPage = pDC->GetDeviceCaps(VERTRES);
|
||
|
// get printer pixels per inch
|
||
|
int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
|
||
|
int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
|
||
|
scale = cxInch/this->GetPrintDPI();
|
||
|
|
||
|
//
|
||
|
// Best Fit case -- create a rectangle which preserves
|
||
|
// the DIB's aspect ratio, and fills the page horizontally.
|
||
|
//
|
||
|
// The formula in the "->bottom" field below calculates the Y
|
||
|
// position of the printed bitmap, based on the size of the
|
||
|
// bitmap, the width of the page, and the relative size of
|
||
|
// a printed pixel (cyInch / cxInch).
|
||
|
//
|
||
|
rcDest.bottom = rcDest.left = 0;
|
||
|
if (((float)cyDIB*(float)cxPage/(float)cxInch) >
|
||
|
((float)cxDIB*(float)cyPage/(float)cyInch))
|
||
|
{
|
||
|
rcDest.top = cyPage;
|
||
|
rcDest.right = ((float)(cyPage*cxInch*cxDIB)) /
|
||
|
((float)(cyInch*cyDIB));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
rcDest.right = cxPage;
|
||
|
rcDest.top = ((float)(cxPage*cyInch*cyDIB)) /
|
||
|
((float)(cxInch*cxDIB));
|
||
|
}
|
||
|
|
||
|
CRect rcDestLP(rcDest);
|
||
|
pDC->DPtoLP(rcDestLP);
|
||
|
int DPI = this->RenderWindow->GetDPI();
|
||
|
|
||
|
this->RenderWindow->SetupMemoryRendering(rcDest.right/scale,
|
||
|
rcDest.top/scale,
|
||
|
pDC->m_hAttribDC);
|
||
|
|
||
|
this->RenderWindow->Render();
|
||
|
|
||
|
pDC->SetStretchBltMode(HALFTONE);
|
||
|
|
||
|
StretchBlt(pDC->GetSafeHdc(),0,0,
|
||
|
rcDest.right, rcDest.top,
|
||
|
this->RenderWindow->GetMemoryDC(),
|
||
|
0, 0, rcDest.right/scale, rcDest.top/scale, SRCCOPY);
|
||
|
|
||
|
this->RenderWindow->ResumeScreenRendering();
|
||
|
|
||
|
EndWaitCursor();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this->RenderWindow->Render();
|
||
|
}
|
||
|
CView::OnDraw(pDC);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// vtkMFCRenderView diagnostics
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
void vtkMFCRenderView::AssertValid() const
|
||
|
{
|
||
|
CView::AssertValid();
|
||
|
}
|
||
|
|
||
|
void vtkMFCRenderView::Dump(CDumpContext& dc) const
|
||
|
{
|
||
|
CView::Dump(dc);
|
||
|
}
|
||
|
#endif //_DEBUG
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// vtkMFCRenderView message handlers
|
||
|
|
||
|
|
||
|
int vtkMFCRenderView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||
|
{
|
||
|
if (vtkMFCView::OnCreate(lpCreateStruct) == -1)
|
||
|
return -1;
|
||
|
|
||
|
// TODO: Add your specialized creation code here
|
||
|
this->RenderWindow->SetParentId(lpCreateStruct->hwndParent);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void vtkMFCRenderView::OnInitialUpdate()
|
||
|
{
|
||
|
vtkMFCView::OnInitialUpdate();
|
||
|
|
||
|
// TODO: Add your specialized creation code here
|
||
|
|
||
|
this->RenderWindow->SetWindowId(this->m_hWnd);
|
||
|
this->RenderWindow->WindowInitialize();
|
||
|
}
|
||
|
|
||
|
// Define our own event handler here
|
||
|
LRESULT vtkMFCRenderView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (message)
|
||
|
{
|
||
|
//case WM_PAINT:
|
||
|
case WM_LBUTTONDOWN:
|
||
|
case WM_LBUTTONUP:
|
||
|
case WM_MBUTTONDOWN:
|
||
|
case WM_MBUTTONUP:
|
||
|
case WM_RBUTTONDOWN:
|
||
|
case WM_RBUTTONUP:
|
||
|
case WM_MOUSEMOVE:
|
||
|
case WM_MOUSEWHEEL:
|
||
|
case WM_CHAR:
|
||
|
case WM_TIMER:
|
||
|
if (this->Interactor->GetInitialized())
|
||
|
{
|
||
|
return vtkHandleMessage2(this->m_hWnd, message, wParam, lParam,
|
||
|
this->Interactor);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return vtkMFCView::WindowProc(message, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
void vtkMFCRenderView::OnSize(UINT nType, int cx, int cy)
|
||
|
{
|
||
|
vtkMFCView::OnSize(nType, cx, cy);
|
||
|
|
||
|
// TODO: Add your message handler code here
|
||
|
if (this->Interactor->GetInitialized())
|
||
|
{
|
||
|
this->Interactor->SetSize(cx,cy);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL vtkMFCRenderView::OnPreparePrinting(CPrintInfo* pInfo)
|
||
|
{
|
||
|
// TODO: call DoPreparePrinting to invoke the Print dialog box
|
||
|
// default preparation
|
||
|
pInfo->SetMinPage(1);
|
||
|
pInfo->SetMaxPage(1);
|
||
|
return DoPreparePrinting(pInfo);
|
||
|
}
|