⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vtkborlandrenderwindow.cpp

📁 a very goog book
💻 CPP
字号:
//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include <vcl\Sysutils.hpp>#include "vtkBorlandRenderWindow.h"#include "vtkInteractorStyleSwitch.h"#include "vtkInteractorStyleFlight.h"#include "vtkInteractorStyleImage.h"#include "vtkInteractorStyleUser.h"  #pragma package(smart_init)//---------------------------------------------------------------------------// ValidCtrCheck is used to assure that the components created do not have// any pure virtual functions.//static inline void ValidCtrCheck(TvtkBorlandRenderWindow *){  new TvtkBorlandRenderWindow(NULL);}//---------------------------------------------------------------------------namespace Vtkborlandrenderwindow{  void __fastcall PACKAGE Register()    {    TComponentClass classes[1] = {__classid(TvtkBorlandRenderWindow)};    RegisterComponents("Samples", classes, 0);    }}//---------------------------------------------------------------------------__fastcall TvtkBorlandRenderWindow::TvtkBorlandRenderWindow(TComponent* Owner)        : inherited(Owner){  // Do want these  ControlStyle << csCaptureMouse << csClickEvents << csOpaque << csDoubleClicks;  // Don't want these  ControlStyle >> csAcceptsControls >> csSetCaption;    FUsevtkInteractor   = true;  FInteractorMode     = IM_TrackballCamera;  FInteractor         = 0;  FOnVtkClose         = 0;  FRenderWindow       = 0;  FRenderer           = 0;  FAbortCallback      = vtkAbortCallback::New();}//---------------------------------------------------------------------------__fastcall TvtkBorlandRenderWindow::~TvtkBorlandRenderWindow(){    // Delete this first because Renderwindow has a hold on it too  if ( FInteractor )    {    FInteractor->Delete();    FInteractor = 0;    }  if ( FRenderer )    {    FRenderer->GetProps()->RemoveAllItems();    FRenderWindow->RemoveRenderer(FRenderer);    FRenderer->Delete();    FRenderer = 0;    }  if ( FRenderWindow )    {    FRenderWindow->RemoveObserver(FAbortCallback);    FRenderWindow->Delete();    FRenderWindow = 0;    }  FAbortCallback->Delete();}//---------------------------------------------------------------------------vtkWin32OpenGLRenderWindow * __fastcall TvtkBorlandRenderWindow::GetRenderWindow(void){  if ( ! FRenderWindow )    {    // Stuff the renderwindow into our window    FRenderWindow = vtkWin32OpenGLRenderWindow::New();    FRenderWindow->AddObserver( vtkCommand::AbortCheckEvent, FAbortCallback);    FRenderWindow->SetParentId(Parent->Handle);    FRenderWindow->SetWindowId(Handle);    FRenderWindow->DoubleBufferOn();    FRenderWindow->SwapBuffersOn();    // Frame to avoid unsightly garbage during initial    // display which may be long when a complex scene is first rendered    FRenderWindow->Frame();    Invalidate();    }    // We create the interactor here because it makes maintenance better  if (!FInteractor)    {    FInteractor = vtkWin32RenderWindowInteractor::New();    FInteractor->SetRenderWindow(FRenderWindow);    FInteractor->SetInstallMessageProc(false);    SetInteractorMode(FInteractorMode);    FInteractor->UpdateSize(Width,Height);    FInteractor->Initialize();    }  return FRenderWindow;}//---------------------------------------------------------------------------vtkWin32RenderWindowInteractor * __fastcall TvtkBorlandRenderWindow::GetInteractor(void){  if (FRenderWindow)    {    if (!FInteractor)      {      throw Exception("Window exists but no Interactor, this shouldn't happen");      }      }  else    {    this->GetRenderWindow();      }  return FInteractor;}//---------------------------------------------------------------------------vtkRenderer * __fastcall TvtkBorlandRenderWindow::GetRenderer(void){  if (!FRenderer)    {    FRenderer = vtkRenderer::New();    GetRenderWindow()->AddRenderer(FRenderer);    FRenderer->ResetCamera();    DWORD  L = ColorToRGB(Color);    float rgb[3] = { GetRValue(L)/255.0, GetGValue(L)/255.0, GetBValue(L)/255.0 };    FRenderer->SetBackground(rgb);    }  return FRenderer;}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::SetInteractorMode(const vtkBorlandInteractorMode& im){  if ( im <= IM_TrackballActor && im >= IM_JoystickCamera )    {    vtkInteractorStyleSwitch *iass = dynamic_cast<vtkInteractorStyleSwitch*>(FInteractor->GetInteractorStyle());    if (!iass)      {      iass = vtkInteractorStyleSwitch::New();      FInteractor->SetInteractorStyle(iass);      iass->Delete();      }    switch ( im )      {      case IM_JoystickCamera: iass->SetCurrentStyleToJoystickCamera(); break;      case IM_JoystickActor: iass->SetCurrentStyleToJoystickActor(); break;      case IM_TrackballCamera: iass->SetCurrentStyleToTrackballCamera(); break;      case IM_TrackballActor: iass->SetCurrentStyleToTrackballActor(); break;      default: break;      }      FInteractorMode = im;    }    else if (im==IM_Flight)      {      vtkInteractorStyleFlight *iafl = dynamic_cast<vtkInteractorStyleFlight*>(FInteractor->GetInteractorStyle());      if (!iafl)        {        iafl = vtkInteractorStyleFlight::New();        FInteractor->SetInteractorStyle(iafl);        iafl->Delete();        }      FInteractorMode = IM_Flight;      }    else if (im==IM_Image)      {      vtkInteractorStyleImage *iasi = dynamic_cast<vtkInteractorStyleImage*>(FInteractor->GetInteractorStyle());      if (!iasi)        {        iasi = vtkInteractorStyleImage::New();        FInteractor->SetInteractorStyle(iasi);        iasi->Delete();        }      FInteractorMode = IM_Image;      }    else if (im==IM_User)      {      vtkInteractorStyleUser *iasu = dynamic_cast<vtkInteractorStyleUser*>(FInteractor->GetInteractorStyle());      if (!iasu)        {        iasu = vtkInteractorStyleUser::New();        FInteractor->SetInteractorStyle(iasu);        iasu->Delete();        }      FInteractorMode = IM_User;      }    else      {      return;      }}//---------------------------------------------------------------------------// Paint//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::Paint(void){  if (FRenderWindow)    {    try      {      FRenderWindow->Render();      }    catch (...)      {      // Some error trap should occurr here      ShowMessage("An exception occurred whilst rendering");      }    }  else    { // Design time or before RenderWindow creation    inherited::Paint();    }}//---------------------------------------------------------------------------// Event handlers//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::WMEraseBkgnd(TWMEraseBkgnd &Message){  if (!FRenderWindow)    {    inherited::Dispatch(&Message);    }  else    {    Message.Result = 1; // No, but thanks for asking.    } }//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::WMGetDlgCode(TMessage &Message){  Message.Result = DLGC_WANTARROWS;}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::WMChar(TWMKey &Message){  switch (Message.CharCode)    {    case 'e':    case 'E':    case 'q':    case 'Q': if (!FOnVtkClose || (FOnVtkClose && FOnVtkClose(this)))                {                FInteractor->OnChar(Handle,Message.CharCode, 0, 0);                }              break;    default:  FInteractor->OnChar(Handle,Message.CharCode, 0, 0);    }}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::WMKeyDown(TWMKey &Message){  FInteractor->OnKeyDown(Handle,Message.CharCode, 0, 0);}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::WMKeyUp(TWMKey &Message){  FInteractor->OnKeyUp(Handle,Message.CharCode, 0, 0);}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::MouseMove(TShiftState shift, int x, int y ){  if(this->OnMouseMove && shift.Contains(ssCtrl))    {    this->OnMouseMove(this,shift,x,y);    return;    }  if (FInteractor && FUsevtkInteractor)    {    int flags = 0;    if (shift.Contains(ssShift)) flags += MK_SHIFT;    if (shift.Contains(ssCtrl))  flags += MK_CONTROL;    FInteractor->OnMouseMove(Handle, flags, x, y );    }}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::MouseDown(TMouseButton button, TShiftState shift, int x, int y ){  if (::GetFocus()!=Handle) SetFocus();  if(this->OnMouseDown && shift.Contains(ssCtrl))    {    this->OnMouseDown(this,button,shift,x,y);    return;    }  if (FInteractor && FUsevtkInteractor)    {    int flags = 0;    if (shift.Contains(ssShift)) flags += MK_SHIFT;    if (shift.Contains(ssCtrl))  flags += MK_CONTROL;    switch (button)      {      case mbLeft:   FInteractor->OnLButtonDown(Handle, flags, x,y); break;      case mbRight:  FInteractor->OnRButtonDown(Handle, flags, x,y); break;      case mbMiddle: FInteractor->OnMButtonDown(Handle, flags, x,y); break;      }    }}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::MouseUp(TMouseButton button, TShiftState shift, int x, int y ){  if(this->OnMouseUp  && shift.Contains(ssCtrl))    {    this->OnMouseUp(this,button,shift,x,y);    return;    }  if (FInteractor && FUsevtkInteractor)    {    int flags = 0;    if (shift.Contains(ssShift)) flags += MK_SHIFT;    if (shift.Contains(ssCtrl))  flags += MK_CONTROL;    switch (button)      {      case mbLeft:   FInteractor->OnLButtonUp(Handle, flags, x,y); break;      case mbRight:  FInteractor->OnRButtonUp(Handle, flags, x,y); break;      case mbMiddle: FInteractor->OnMButtonUp(Handle, flags, x,y); break;      }    }}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::Resize(void){  if (FInteractor)    {    FInteractor->OnSize(this->Handle, 0, this->Width, this->Height);    }}//---------------------------------------------------------------------------void __fastcall TvtkBorlandRenderWindow::WMTimer(TWMTimer &Message){  if (FInteractor)    {    FInteractor->OnTimer(Handle,Message.TimerID);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -