0027736: Samples - rectangle selection issues within MFC sample Viewer3d
authorkgv <kgv@opencascade.com>
Sun, 25 Mar 2018 08:53:09 +0000 (11:53 +0300)
committerbugmaster <bugmaster@opencascade.com>
Mon, 26 Mar 2018 13:00:24 +0000 (16:00 +0300)
CViewer3dView, CAnimationView3D, COCCDemoView now use AIS_RubberBand.

samples/mfc/standard/04_Viewer3d/src/Viewer3dView.cpp
samples/mfc/standard/04_Viewer3d/src/Viewer3dView.h
samples/mfc/standard/09_Animation/src/AnimationView3D.cpp
samples/mfc/standard/09_Animation/src/AnimationView3D.h
samples/mfc/standard/10_Convert/src/WNT/OCCDemoView.cpp
samples/mfc/standard/10_Convert/src/WNT/OCCDemoView.h

index 01da072..728f2d4 100755 (executable)
@@ -13,6 +13,7 @@
 #include "ModelClippingDlg.h"
 #include "TrihedronDlg.h"
 
+#include <AIS_RubberBand.hxx>
 #include <V3d_AmbientLight.hxx>
 #include <V3d_DirectionalLight.hxx>
 #include <V3d_PositionalLight.hxx>
@@ -109,7 +110,7 @@ CViewer3dView::CViewer3dView()
   myCurZoom (0.0),
   NbActiveLights (2), // There are 2 default active lights
   myHlrModeIsOn (Standard_False),
-  m_Pen (NULL),
+  myRect (new AIS_RubberBand (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0)),
   myAxisKey (0),
   myScaleDirection (0)
 {
@@ -120,7 +121,6 @@ CViewer3dView::CViewer3dView()
 CViewer3dView::~CViewer3dView()
 {
   myView->Remove();
-  if (m_Pen) delete m_Pen;
 }
 
 BOOL CViewer3dView::PreCreateWindow(CREATESTRUCT& cs)
@@ -646,7 +646,6 @@ void CViewer3dView::OnMouseMove(UINT nFlags, CPoint point)
         {
          case CurAction3d_Nothing :
 
-                  DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
            myXmax = point.x;      myYmax = point.y;
            if (nFlags & MK_SHIFT)              
                     GetDocument()->ShiftDragEvent(myXmax,myYmax,0,myView);
@@ -661,8 +660,7 @@ void CViewer3dView::OnMouseMove(UINT nFlags, CPoint point)
          break;
          case CurAction3d_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 CurAction3d_DynamicPanning :
@@ -799,60 +797,34 @@ void CViewer3dView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
        pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
 }
 
-void CViewer3dView::DrawRectangle(const Standard_Integer  MinX    ,
-                                                           const Standard_Integer  MinY    ,
-                                        const Standard_Integer  MaxX ,
-                                                           const Standard_Integer  MaxY ,
-                                                           const Standard_Boolean  Draw , 
-                                        const LineStyle aLineStyle)
+void CViewer3dView::DrawRectangle (Standard_Integer theMinX,
+                                   Standard_Integer theMinY,
+                                   Standard_Integer theMaxX,
+                                   Standard_Integer theMaxY,
+                                   Standard_Boolean theToDraw,
+                                   Aspect_TypeOfLine theLineType)
 {
-    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);
+  const Handle(AIS_InteractiveContext)& aCtx = GetDocument()->GetAISContext();
+  if (!theToDraw)
+  {
+    aCtx->Remove (myRect, false);
+    aCtx->CurrentViewer()->RedrawImmediate();
+    return;
+  }
 
-    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;
-   }
-
-    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 CViewer3dView::OnModifyChangeBackground() 
index 7d8f474..1f2d349 100755 (executable)
@@ -33,6 +33,8 @@ enum View3D_CurrentAction {
   CurAction3d_EndDirectionalLight
 };
 
+class AIS_RubberBand;
+
 class CViewer3dView : public CView
 {
 protected: // create from serialization only
@@ -145,16 +147,13 @@ private:
   Handle(V3d_DirectionalLight)   myCurrent_DirectionalLight;
   Handle(Graphic3d_ClipPlane)    myClippingPlane;
   Handle(AIS_Shape)              myShape;
+  Handle(AIS_RubberBand)         myRect; //!< Rubber rectangle for selection
 
 private:
-       enum LineStyle { Solid, Dot, ShortDash, LongDash, Default };
-       CPen*  m_Pen;
-    virtual void DrawRectangle (const Standard_Integer  MinX  ,
-                                               const Standard_Integer  MinY  ,
-                                const Standard_Integer  MaxX  ,
-                                               const Standard_Integer  MaxY  ,
-                                                   const Standard_Boolean  Draw  ,
-                                const LineStyle aLineStyle = Default  );
+
+       void DrawRectangle (Standard_Integer theMinX, Standard_Integer theMinY, Standard_Integer theMaxX, Standard_Integer theMaxY,
+                       Standard_Boolean theToDraw, Aspect_TypeOfLine theLineType = Aspect_TOL_SOLID);
+
        UINT myAxisKey;
        UINT myScaleDirection;
        void RedrawVisMode();
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);            
index 2000eef..fafdc33 100755 (executable)
@@ -13,6 +13,8 @@
 #include "AnimationDoc.h"
 #include "..\..\Common\res\OCC_Resource.h"
 
+class AIS_RubberBand;
+
 enum View3D_CurrentAction { 
   CurrentAction3d_Nothing,
   CurrentAction3d_DynamicZooming,
@@ -146,14 +148,9 @@ private:
   double               m_Focus ;
 
 private:
-       enum LineStyle { Solid, Dot, ShortDash, LongDash, Default };
-       CPen*  m_Pen;
-    virtual void DrawRectangle (const Standard_Integer  MinX  ,
-                                               const Standard_Integer  MinY  ,
-                                const Standard_Integer  MaxX  ,
-                                               const Standard_Integer  MaxY  ,
-                                                   const Standard_Boolean  Draw  ,
-                                const LineStyle aLineStyle = Default  );
+  Handle(AIS_RubberBand) myRect; //!< Rubber rectangle for selection
+  void DrawRectangle (Standard_Integer theMinX, Standard_Integer theMinY, Standard_Integer theMaxX, Standard_Integer theMaxY,
+                      Standard_Boolean theToDraw, Aspect_TypeOfLine theLineType = Aspect_TOL_SOLID);
 };
 
 #ifndef _DEBUG  // debug version in AnimationView.cpp
index 2c8dd36..e16f537 100755 (executable)
@@ -7,6 +7,7 @@
 #include "OCCDemoDoc.h"
 #include "OCCDemoView.h"
 
+#include <AIS_RubberBand.hxx>
 #include <Graphic3d_GraphicDriver.hxx>
 
 #define ValZWMin 1
@@ -69,7 +70,7 @@ COCCDemoView::COCCDemoView()
   myCurZoom=0;
   myCurrentMode = CurAction3d_Nothing;
   myVisMode = VIS_SHADE;
-  m_Pen = NULL;
+  myRect = new AIS_RubberBand (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0);
   myGraphicDriver = ((COCCDemoApp*)AfxGetApp())->GetGraphicDriver();
 }
 
@@ -77,8 +78,6 @@ COCCDemoView::~COCCDemoView()
 {
        if (!myView.IsNull())
     myView->Remove();
-  if (m_Pen)
-    delete m_Pen;
 }
 
 BOOL COCCDemoView::PreCreateWindow(CREATESTRUCT& cs)
@@ -336,8 +335,7 @@ void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point)
         break;
       case CurAction3d_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 CurAction3d_DynamicPanning :
         myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
@@ -407,67 +405,34 @@ void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI)
        pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
 }
 
-void COCCDemoView::DrawRectangle(const Standard_Integer  MinX,
-                                        const Standard_Integer  MinY,
-                                        const Standard_Integer  MaxX,
-                                        const Standard_Integer  MaxY,
-                                        const Standard_Boolean  Draw, 
-                                        const LineStyle aLineStyle)
+void COCCDemoView::DrawRectangle (Standard_Integer theMinX,
+                                  Standard_Integer theMinY,
+                                  Standard_Integer theMaxX,
+                                  Standard_Integer theMaxY,
+                                  Standard_Boolean theToDraw,
+                                  Aspect_TypeOfLine theLineType)
 {
-  static int m_DrawMode;
-  if  (!m_Pen && aLineStyle ==Solid )
+  const Handle(AIS_InteractiveContext)& aCtx = GetDocument()->GetAISContext();
+  if (!theToDraw)
   {
-    m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;
+    aCtx->Remove (myRect, false);
+    aCtx->CurrentViewer()->RedrawImmediate();
+    return;
   }
-  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 = Standard_False;
-
-  if ( m_IsVisible && !Draw) // move or up  : erase at the old position 
+  CRect aRect;
+  GetWindowRect (aRect);
+  myRect->SetLineType (theLineType);
+  myRect->SetRectangle (theMinX, aRect.Height() - theMinY, theMaxX, aRect.Height() - theMaxY);
+  if (!aCtx->IsDisplayed (myRect))
   {
-    clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
-    clientDC.LineTo(StoredMaxX,StoredMaxY); 
-    clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
-    m_IsVisible = false;
+    aCtx->Display (myRect, false);
   }
-
-  StoredMinX = Min ( MinX, MaxX );
-  StoredMinY = Min ( MinY, MaxY );
-  StoredMaxX = Max ( MinX, MaxX );
-  StoredMaxY = Max ( MinY, MaxY);
-
-  if (Draw) // move : draw
+  else
   {
-    clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
-    clientDC.LineTo(StoredMaxX,StoredMaxY); 
-    clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
-    m_IsVisible = true;
+    aCtx->Redisplay (myRect, false);
   }
-
-  if (m_Pen) 
-    clientDC.SelectObject(aOldPen);
+  aCtx->CurrentViewer()->RedrawImmediate();
 }
 
 void COCCDemoView::InitButtons()
index ab626b1..d8379b6 100755 (executable)
@@ -18,6 +18,8 @@ enum View3D_CurrentAction {
   CurAction3d_DynamicRotation
 };
 
+class AIS_RubberBand;
+
 class COCCDemoView : public CView
 {
 protected: // create from serialization only
@@ -119,14 +121,13 @@ private:
   Standard_Real        myCurZoom;
 
 private:
-  enum LineStyle { Solid, Dot, ShortDash, LongDash, Default };
-  CPen*  m_Pen;
+  Handle(AIS_RubberBand) myRect; //!< Rubber rectangle for selection
   virtual void DrawRectangle (const Standard_Integer  MinX  ,
                               const Standard_Integer  MinY  ,
                               const Standard_Integer  MaxX  ,
                               const Standard_Integer  MaxY  ,
                               const Standard_Boolean  Draw  ,
-                              const LineStyle aLineStyle = Default  );
+                              Aspect_TypeOfLine theLineType = Aspect_TOL_SOLID);
 
 };