www.pudn.com > vtkDLG.rar > vtkMFCWindow.cpp


/*========================================================================= 
 
  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 "stdafx.h" 
#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(this->GetInteractor())-> 
    OnLButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 1); 
} 
 
void vtkMFCWindow::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
  this->SetFocus(); 
  static_cast(this->GetInteractor())-> 
    OnLButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0); 
} 
 
void vtkMFCWindow::OnMButtonDown(UINT nFlags, CPoint point) 
{ 
  this->SetFocus(); 
  static_cast(this->GetInteractor())-> 
    OnMButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0); 
} 
 
void vtkMFCWindow::OnRButtonDown(UINT nFlags, CPoint point) 
{ 
  this->SetFocus(); 
  static_cast(this->GetInteractor())-> 
    OnRButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0); 
} 
 
void vtkMFCWindow::OnLButtonUp(UINT nFlags, CPoint point) 
{ 
  static_cast(this->GetInteractor())-> 
    OnLButtonUp(this->GetSafeHwnd(), nFlags, point.x, point.y); 
} 
 
void vtkMFCWindow::OnMButtonUp(UINT nFlags, CPoint point) 
{ 
  static_cast(this->GetInteractor())-> 
    OnMButtonUp(this->GetSafeHwnd(), nFlags, point.x, point.y); 
} 
 
void vtkMFCWindow::OnRButtonUp(UINT nFlags, CPoint point) 
{ 
  static_cast(this->GetInteractor())-> 
    OnRButtonUp(this->GetSafeHwnd(), nFlags, point.x, point.y); 
} 
 
void vtkMFCWindow::OnMouseMove(UINT nFlags, CPoint point) 
{ 
  static_cast(this->GetInteractor())-> 
    OnMouseMove(this->GetSafeHwnd(), nFlags, point.x, point.y); 
} 
 
BOOL vtkMFCWindow::OnMouseWheel(UINT nFlags, short zDelta, CPoint point) 
{ 
  if(zDelta > 0) 
    static_cast(this->GetInteractor())-> 
      OnMouseWheelForward(this->GetSafeHwnd(), nFlags, point.x, point.y); 
  else 
    static_cast(this->GetInteractor())-> 
      OnMouseWheelBackward(this->GetSafeHwnd(), nFlags, point.x, point.y); 
  return TRUE; 
} 
 
void vtkMFCWindow::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
  static_cast(this->GetInteractor())-> 
    OnChar(this->GetSafeHwnd(), nChar, nRepCnt, nFlags); 
} 
 
void vtkMFCWindow::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
  static_cast(this->GetInteractor())-> 
    OnKeyUp(this->GetSafeHwnd(), nChar, nRepCnt, nFlags); 
} 
 
void vtkMFCWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
  static_cast(this->GetInteractor())-> 
    OnKeyDown(this->GetSafeHwnd(), nChar, nRepCnt, nFlags); 
} 
 
void vtkMFCWindow::OnTimer(UINT nIDEvent) 
{ 
  static_cast(this->GetInteractor())-> 
    OnTimer(this->GetSafeHwnd(), nIDEvent); 
}