Cloned library of VTK-5.0.0 with extra build files for internal package management.
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.
 
 
 
 
 
 

279 lines
7.5 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkMFCWindow.cpp,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0400
#endif
#include "vtkMFCWindow.h"
#include "vtkWin32OpenGLRenderWindow.h"
#include "vtkWin32RenderWindowInteractor.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(vtkMFCWindow, CWnd)
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_MBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MBUTTONUP()
ON_WM_RBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_MOUSEWHEEL()
ON_WM_CHAR()
ON_WM_KEYUP()
ON_WM_KEYDOWN()
ON_WM_TIMER()
END_MESSAGE_MAP()
#ifdef _DEBUG
void vtkMFCWindow::AssertValid() const
{
CWnd::AssertValid();
}
void vtkMFCWindow::Dump(CDumpContext& dc) const
{
CWnd::Dump(dc);
}
#endif //_DEBUG
vtkMFCWindow::vtkMFCWindow(CWnd *pcWnd)
{
this->pvtkWin32OpenGLRW = NULL;
// create self as a child of passed in parent
DWORD style = WS_VISIBLE | WS_CLIPSIBLINGS;
if(pcWnd)
style |= WS_CHILD;
BOOL bCreated = CWnd::Create(NULL, _T("VTK-MFC Window"),
style, CRect(0, 0, 1, 1),
pcWnd, (UINT)IDC_STATIC);
SUCCEEDED(bCreated);
// create a default vtk window
vtkWin32OpenGLRenderWindow* win = vtkWin32OpenGLRenderWindow::New();
this->SetRenderWindow(win);
win->Delete();
}
vtkMFCWindow::~vtkMFCWindow()
{
this->SetRenderWindow(NULL);
}
void vtkMFCWindow::OnDestroy()
{
if(this->pvtkWin32OpenGLRW && this->pvtkWin32OpenGLRW->GetMapped())
this->pvtkWin32OpenGLRW->Finalize();
CWnd::OnDestroy();
}
void vtkMFCWindow::SetRenderWindow(vtkWin32OpenGLRenderWindow* win)
{
if(this->pvtkWin32OpenGLRW)
{
if(this->pvtkWin32OpenGLRW->GetMapped())
this->pvtkWin32OpenGLRW->Finalize();
this->pvtkWin32OpenGLRW->UnRegister(NULL);
}
this->pvtkWin32OpenGLRW = win;
if(this->pvtkWin32OpenGLRW)
{
this->pvtkWin32OpenGLRW->Register(NULL);
vtkWin32RenderWindowInteractor* iren = vtkWin32RenderWindowInteractor::New();
iren->SetInstallMessageProc(0);
// setup the parent window
this->pvtkWin32OpenGLRW->SetWindowId(this->GetSafeHwnd());
this->pvtkWin32OpenGLRW->SetParentId(::GetParent(this->GetSafeHwnd()));
iren->SetRenderWindow(this->pvtkWin32OpenGLRW);
iren->Initialize();
// update size
CRect cRect = CRect(0,0,1,1);
if(this->GetParent())
this->GetParent()->GetClientRect(&cRect);
if (iren->GetInitialized())
iren->UpdateSize(cRect.Width(), cRect.Height());
// release our hold on interactor
iren->Delete();
}
}
vtkWin32OpenGLRenderWindow* vtkMFCWindow::GetRenderWindow()
{
return this->pvtkWin32OpenGLRW;
}
vtkRenderWindowInteractor* vtkMFCWindow::GetInteractor()
{
if(!this->pvtkWin32OpenGLRW)
return NULL;
return this->pvtkWin32OpenGLRW->GetInteractor();
}
void vtkMFCWindow::OnPaint()
{
CPaintDC dc(this);
if (this->GetInteractor() && this->GetInteractor()->GetInitialized())
{
this->GetInteractor()->Render();
}
}
void vtkMFCWindow::DrawDC(CDC* pDC)
{
// Obtain the size of the printer page in pixels.
int cxPage = pDC->GetDeviceCaps(HORZRES);
int cyPage = pDC->GetDeviceCaps(VERTRES);
// Get the size of the window in pixels.
int *size = this->pvtkWin32OpenGLRW->GetSize();
int cxWindow = size[0];
int cyWindow = size[1];
float fx = float(cxPage) / float(cxWindow);
float fy = float(cyPage) / float(cyWindow);
float scale = min(fx,fy);
int x = int(scale * float(cxWindow));
int y = int(scale * float(cyWindow));
this->pvtkWin32OpenGLRW->SetupMemoryRendering(cxWindow, cyWindow, pDC->GetSafeHdc());
this->pvtkWin32OpenGLRW->Render();
HDC memDC = this->pvtkWin32OpenGLRW->GetMemoryDC();
StretchBlt(pDC->GetSafeHdc(),0,0,x,y,memDC,0,0,cxWindow,cyWindow,SRCCOPY);
this->pvtkWin32OpenGLRW->ResumeScreenRendering();
}
void vtkMFCWindow::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (this->GetInteractor() && this->GetInteractor()->GetInitialized())
this->GetInteractor()->UpdateSize(cx, cy);
}
BOOL vtkMFCWindow::OnEraseBkgnd(CDC*)
{
return TRUE;
}
void vtkMFCWindow::OnLButtonDblClk(UINT nFlags, CPoint point)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnLButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 1);
}
void vtkMFCWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
this->SetFocus();
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnLButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0);
}
void vtkMFCWindow::OnMButtonDown(UINT nFlags, CPoint point)
{
this->SetFocus();
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnMButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0);
}
void vtkMFCWindow::OnRButtonDown(UINT nFlags, CPoint point)
{
this->SetFocus();
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnRButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0);
}
void vtkMFCWindow::OnLButtonUp(UINT nFlags, CPoint point)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnLButtonUp(this->GetSafeHwnd(), nFlags, point.x, point.y);
}
void vtkMFCWindow::OnMButtonUp(UINT nFlags, CPoint point)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnMButtonUp(this->GetSafeHwnd(), nFlags, point.x, point.y);
}
void vtkMFCWindow::OnRButtonUp(UINT nFlags, CPoint point)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnRButtonUp(this->GetSafeHwnd(), nFlags, point.x, point.y);
}
void vtkMFCWindow::OnMouseMove(UINT nFlags, CPoint point)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnMouseMove(this->GetSafeHwnd(), nFlags, point.x, point.y);
}
BOOL vtkMFCWindow::OnMouseWheel(UINT nFlags, short zDelta, CPoint point)
{
if(zDelta > 0)
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnMouseWheelForward(this->GetSafeHwnd(), nFlags, point.x, point.y);
else
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnMouseWheelBackward(this->GetSafeHwnd(), nFlags, point.x, point.y);
return TRUE;
}
void vtkMFCWindow::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnChar(this->GetSafeHwnd(), nChar, nRepCnt, nFlags);
}
void vtkMFCWindow::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnKeyUp(this->GetSafeHwnd(), nChar, nRepCnt, nFlags);
}
void vtkMFCWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnKeyDown(this->GetSafeHwnd(), nChar, nRepCnt, nFlags);
}
void vtkMFCWindow::OnTimer(UINT nIDEvent)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnTimer(this->GetSafeHwnd(), nIDEvent);
}