0027736: Samples - rectangle selection issues within MFC sample Viewer3d
[occt.git] / samples / mfc / standard / 09_Animation / src / AnimationView3D.cpp
index 0ffae37..ad4f0d6 100755 (executable)
@@ -11,6 +11,8 @@
 
 #include "Sensitivity.h"
 
+#include <AIS_RubberBand.hxx>
+
 #ifdef _DEBUG
 //#define new DEBUG_NEW by CasCade
 #undef THIS_FILE
@@ -92,7 +94,7 @@ CAnimationView3D::CAnimationView3D()
   myCurrentMode  (CurrentAction3d_Nothing),
   m_FlySens  (500.0),
   m_TurnSens (M_PI / 40.0),
-  m_Pen (NULL)
+  myRect (new AIS_RubberBand (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0))
 {
   // TODO: add construction code here
 }
@@ -100,7 +102,6 @@ CAnimationView3D::CAnimationView3D()
 CAnimationView3D::~CAnimationView3D()
 {
     myView->Remove();
-    if (m_Pen) delete m_Pen;
 }
 
 BOOL CAnimationView3D::PreCreateWindow(CREATESTRUCT& cs)
@@ -403,7 +404,7 @@ void CAnimationView3D::OnLButtonUp(UINT nFlags, CPoint point)
          break;
          case CurrentAction3d_WindowZooming :
            myXmax=point.x;            myYmax=point.y;
-            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
+            DrawRectangle (myXmin, myYmin, myXmax, myYmax, Standard_False, Aspect_TOL_DASH);
               if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
                                         // Test if the zoom window is greater than a minimale window.
                        {
@@ -503,7 +504,6 @@ void CAnimationView3D::OnMouseMove(UINT nFlags, CPoint point)
         {
          case CurrentAction3d_Nothing :
                   myXmax = point.x;            myYmax = point.y;
-            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
            if (nFlags & MK_SHIFT)              
                     GetDocument()->ShiftDragEvent(myXmax,myYmax,0,myView);
            else
@@ -517,8 +517,7 @@ void CAnimationView3D::OnMouseMove(UINT nFlags, CPoint point)
          break;
          case CurrentAction3d_WindowZooming :
                   myXmax = point.x; myYmax = point.y;  
-            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
-            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
+            DrawRectangle (myXmin, myYmin, myXmax, myYmax, Standard_True, Aspect_TOL_DASH);
          break;
          case CurrentAction3d_DynamicPanning :
                   myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
@@ -652,57 +651,36 @@ void CAnimationView3D::OnChangeBackground()
 //-----------------------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------------------
-void CAnimationView3D::DrawRectangle(const Standard_Integer  MinX    ,
-                                                           const Standard_Integer  MinY    ,
-                                        const Standard_Integer  MaxX ,
-                                                           const Standard_Integer  MaxY ,
-                                                           const Standard_Boolean  Draw , 
-                                        const LineStyle aLineStyle)
-{
-    static int m_DrawMode;
-    if  (!m_Pen && aLineStyle ==Solid )
-        {m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;}
-    else if (!m_Pen && aLineStyle ==Dot )
-        {m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0));   m_DrawMode = R2_XORPEN;}
-    else if (!m_Pen && aLineStyle == ShortDash)
-        {m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0));   m_DrawMode = R2_XORPEN;}
-    else if (!m_Pen && aLineStyle == LongDash)
-        {m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0));     m_DrawMode = R2_NOTXORPEN;}
-    else if (aLineStyle == Default) 
-        { m_Pen = NULL;        m_DrawMode = R2_MERGEPENNOT;}
-
-    CPen* aOldPen = NULL;
-    CClientDC clientDC(this);
-    if (m_Pen) aOldPen = clientDC.SelectObject(m_Pen);
-    clientDC.SetROP2(m_DrawMode);
-
-    static             Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
-    static             Standard_Boolean m_IsVisible;
-
-    if ( m_IsVisible && !Draw) // move or up  : erase at the old position 
-    {
-     clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
-     clientDC.LineTo(StoredMaxX,StoredMaxY); 
-        clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
-     m_IsVisible = false;
-    }
-
-    StoredMinX = Min ( MinX, MaxX );
-    StoredMinY = Min ( MinY, MaxY );
-    StoredMaxX = Max ( MinX, MaxX );
-    StoredMaxY = Max ( MinY, MaxY);
-
-    if (Draw) // move : draw
-    {
-     clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
-     clientDC.LineTo(StoredMaxX,StoredMaxY); 
-        clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
-     m_IsVisible = true;
-   }
+void CAnimationView3D::DrawRectangle (Standard_Integer theMinX,
+                                      Standard_Integer theMinY,
+                                      Standard_Integer theMaxX,
+                                      Standard_Integer theMaxY,
+                                      Standard_Boolean theToDraw,
+                                      Aspect_TypeOfLine theLineType)
+{
+  const Handle(AIS_InteractiveContext)& aCtx = GetDocument()->GetAISContext();
+  if (!theToDraw)
+  {
+    aCtx->Remove (myRect, false);
+    aCtx->CurrentViewer()->RedrawImmediate();
+    return;
+  }
 
-   if (m_Pen) 
-       clientDC.SelectObject(aOldPen);
+  CRect aRect;
+  GetWindowRect (aRect);
+  myRect->SetLineType (theLineType);
+  myRect->SetRectangle (theMinX, aRect.Height() - theMinY, theMaxX, aRect.Height() - theMaxY);
+  if (!aCtx->IsDisplayed (myRect))
+  {
+    aCtx->Display (myRect, false);
+  }
+  else
+  {
+    aCtx->Redisplay (myRect, false);
+  }
+  aCtx->CurrentViewer()->RedrawImmediate();
 }
+
 void CAnimationView3D::OnStop() 
 {
        KillTimer(GetDocument()->myCount);