0021985: Vista/WIndows 7 compatibility issues reported by the community
[occt.git] / samples / mfc / standard / Common / OCC_3dView.cpp
1 // OCC_3dView.cpp: implementation of the OCC_3dView class.
2 //
3
4 #include "stdafx.h"
5
6 #include "OCC_3dView.h"
7
8 #include "OCC_3dApp.h"
9 #include "OCC_3dBaseDoc.h"
10 #include <res\OCC_Resource.h>
11
12 #include <Visual3d_View.hxx>
13 #include <Graphic3d_ExportFormat.hxx>
14
15 #define ValZWMin 1
16
17 IMPLEMENT_DYNCREATE(OCC_3dView, CView)
18
19 BEGIN_MESSAGE_MAP(OCC_3dView, CView)
20         //{{AFX_MSG_MAP(OCC_3dView)
21         ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo)
22         ON_COMMAND(ID_BUTTONBack, OnBUTTONBack)
23         ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom)
24         ON_COMMAND(ID_BUTTONFront, OnBUTTONFront)
25         ON_COMMAND(ID_BUTTONHlrOff, OnBUTTONHlrOff)
26         ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn)
27         ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft)
28         ON_COMMAND(ID_BUTTONPan, OnBUTTONPan)
29         ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo)
30         ON_COMMAND(ID_BUTTONReset, OnBUTTONReset)
31         ON_COMMAND(ID_BUTTONRight, OnBUTTONRight)
32         ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
33         ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
34         ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
35         ON_WM_SIZE()
36     ON_COMMAND(ID_FILE_EXPORT_IMAGE, OnFileExportImage)
37         ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
38         ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin)
39         ON_WM_LBUTTONDOWN()
40         ON_WM_LBUTTONUP()
41         ON_WM_MBUTTONDOWN()
42         ON_WM_MBUTTONUP()
43         ON_WM_MOUSEMOVE()
44         ON_WM_RBUTTONDOWN()
45         ON_WM_RBUTTONUP()
46         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOff, OnUpdateBUTTONHlrOff)
47         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
48         ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
49         ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
50         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
51         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
52         ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
53         ON_COMMAND(ID_Modify_ChangeBackground     , OnModifyChangeBackground)
54         //}}AFX_MSG_MAP
55 END_MESSAGE_MAP()
56
57 /////////////////////////////////////////////////////////////////////////////
58 // OCC_3dView construction/destruction
59
60 OCC_3dView::OCC_3dView()
61 {
62         // TODO: add construction code here
63     myXmin=0;
64     myYmin=0;  
65     myXmax=0;
66     myYmax=0;
67     myCurZoom=0;
68         myWidth=0;
69         myHeight=0;
70     // will be set in OnInitial update, but, for more security :
71     myCurrentMode = CurAction3d_Nothing;
72     myDegenerateModeIsOn=Standard_True;
73     m_Pen = NULL;
74         
75 }
76
77 OCC_3dView::~OCC_3dView()
78 {
79         if ( myView )
80                 myView->Remove();
81         if (m_Pen) delete m_Pen;
82 }
83
84 BOOL OCC_3dView::PreCreateWindow(CREATESTRUCT& cs)
85 {
86         // TODO: Modify the Window class or styles here by modifying
87         //  the CREATESTRUCT cs
88
89         return CView::PreCreateWindow(cs);
90 }
91
92 /////////////////////////////////////////////////////////////////////////////
93 // OCC_3dView drawing
94 void OCC_3dView::OnInitialUpdate() 
95 {
96         CView::OnInitialUpdate();
97         
98     myView = GetDocument()->GetViewer()->CreateView();
99
100     // set the default mode in wireframe ( not hidden line ! )
101     myView->SetDegenerateModeOn();
102     // store for restore state after rotation (witch is in Degenerated mode)
103     myDegenerateModeIsOn = Standard_True;
104
105
106         Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice = 
107                 ((OCC_3dApp*)AfxGetApp())->GetGraphicDevice();
108     
109     Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,GetSafeHwnd ());
110     myView->SetWindow(aWNTWindow);
111     if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
112
113     // store the mode ( nothing , dynamic zooming, dynamic ... )
114     myCurrentMode = CurAction3d_Nothing;
115         
116 }
117
118 void OCC_3dView::OnDraw(CDC* pDC)
119 {
120         CRect aRect;
121         GetWindowRect(aRect);
122         if(myWidth != aRect.Width() || myHeight != aRect.Height()) {
123                 myWidth = aRect.Width();
124                 myHeight = aRect.Height();
125                 ::PostMessage ( GetSafeHwnd () , WM_SIZE , SW_SHOW , myWidth + myHeight*65536 );
126         }
127         myView->Redraw();
128
129 }
130
131 /////////////////////////////////////////////////////////////////////////////
132 // OCC_3dView diagnostics
133
134 #ifdef _DEBUG
135 void OCC_3dView::AssertValid() const
136 {
137         CView::AssertValid();
138 }
139
140 void OCC_3dView::Dump(CDumpContext& dc) const
141 {
142         CView::Dump(dc);
143 }
144
145 OCC_3dBaseDoc* OCC_3dView::GetDocument() // non-debug version is inline
146 {
147 //      ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(OCC_3dBaseDoc)));
148         return (OCC_3dBaseDoc*)m_pDocument;
149 }
150
151 #endif //_DEBUG
152
153 /////////////////////////////////////////////////////////////////////////////
154 // OCC_3dView message handlers
155 void OCC_3dView::OnFileExportImage()
156 {
157   LPCTSTR filter;
158   filter = _T("EXR Files (*.EXR)|*.exr|TGA Files (*.TGA)|*.tga|TIFF Files (*.TIFF)|*.tiff|"
159               "PPM Files (*.PPM)|*.ppm|JPEG Files(*.JPEG)|*.jpeg|PNG Files (*.PNG)|*.png|"
160               "GIF Files (*.GIF)|*.gif|BMP Files (*.BMP)|*.bmp|PS Files (*.PS)|*.ps|"
161               "EPS Files (*.EPS)|*.eps|TEX Files (*.TEX)|*.tex|PDF Files (*.PDF)|*.pdf"
162               "|SVG Files (*.SVG)|*.svg|PGF Files (*.PGF)|*.pgf|EMF Files (*.EMF)|*.emf||");
163   CFileDialog dlg(FALSE,_T("*.BMP"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
164                   filter, 
165                   NULL );
166
167   if (dlg.DoModal() == IDOK) 
168   {
169     CString aFileName = dlg.GetPathName();
170     CString ext = dlg.GetFileExt();
171     if (!(ext.CompareNoCase("ps")) || !(ext.CompareNoCase("emf"))
172         || !(ext.CompareNoCase("pdf")) || !(ext.CompareNoCase("eps"))
173         || !(ext.CompareNoCase("tex")) || !(ext.CompareNoCase("svg"))
174         || !(ext.CompareNoCase("pgf")))
175     {
176       Graphic3d_ExportFormat exFormat;
177       if (!(ext.CompareNoCase("ps"))) exFormat = Graphic3d_EF_PostScript;
178       else             exFormat = Graphic3d_EF_EnhPostScript;
179       myView->View()->Export( aFileName, exFormat );
180       return;
181     }
182     myView->Dump(aFileName);
183   }
184 }
185
186 void OCC_3dView::OnSize(UINT nType, int cx, int cy) 
187 {
188   if (!myView.IsNull())
189    myView->MustBeResized();
190 }
191
192 void OCC_3dView::OnBUTTONBack() 
193 { myView->SetProj(V3d_Xneg); } // See the back View
194 void OCC_3dView::OnBUTTONFront() 
195 { myView->SetProj(V3d_Xpos); } // See the front View
196
197 void OCC_3dView::OnBUTTONBottom() 
198 { myView->SetProj(V3d_Zneg); } // See the bottom View
199 void OCC_3dView::OnBUTTONTop() 
200 { myView->SetProj(V3d_Zpos); } // See the top View      
201
202 void OCC_3dView::OnBUTTONLeft() 
203 { myView->SetProj(V3d_Ypos); } // See the left View     
204 void OCC_3dView::OnBUTTONRight() 
205 { myView->SetProj(V3d_Yneg); } // See the right View
206
207 void OCC_3dView::OnBUTTONAxo() 
208 { myView->SetProj(V3d_XposYnegZpos); } // See the axonometric View
209
210 void OCC_3dView::OnBUTTONHlrOff() 
211 {
212   myView->SetDegenerateModeOn();
213   myDegenerateModeIsOn = Standard_True;
214 }
215
216 void OCC_3dView::OnBUTTONHlrOn() 
217 {
218   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
219   myView->SetDegenerateModeOff();
220   myDegenerateModeIsOn = Standard_False;
221   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
222 }
223
224 void OCC_3dView::OnBUTTONPan() 
225 {  myCurrentMode = CurAction3d_DynamicPanning; }
226
227 void OCC_3dView::OnBUTTONPanGlo() 
228 {
229   // save the current zoom value 
230   myCurZoom = myView->Scale();
231   // Do a Global Zoom 
232   //myView->FitAll();
233   // Set the mode 
234   myCurrentMode = CurAction3d_GlobalPanning;
235 }
236
237 void OCC_3dView::OnBUTTONReset() 
238 {   myView->Reset(); }
239
240 void OCC_3dView::OnBUTTONRot() 
241 {   myCurrentMode = CurAction3d_DynamicRotation; }
242
243
244 void OCC_3dView::OnBUTTONZoomAll() 
245 {
246   myView->FitAll();
247   myView->ZFitAll();
248 }
249
250 void OCC_3dView::OnBUTTONZoomProg() 
251 {  myCurrentMode = CurAction3d_DynamicZooming; }
252
253 void OCC_3dView::OnBUTTONZoomWin() 
254 {  myCurrentMode = CurAction3d_WindowZooming; }
255
256 void OCC_3dView::OnLButtonDown(UINT nFlags, CPoint point) 
257 {
258   //  save the current mouse coordinate in min 
259   myXmin=point.x;  myYmin=point.y;
260   myXmax=point.x;  myYmax=point.y;
261
262   if ( nFlags & MK_CONTROL ) 
263           {
264             // Button MB1 down Control :start zomming 
265         // SetCursor(AfxGetApp()->LoadStandardCursor());
266           }
267         else // if ( Ctrl )
268           {
269         switch (myCurrentMode)
270         {
271          case CurAction3d_Nothing : // start a drag
272            if (nFlags & MK_SHIFT)
273                 GetDocument()->ShiftDragEvent(myXmax,myYmax,-1,myView);
274            else
275                 GetDocument()->DragEvent(myXmax,myYmax,-1,myView);
276         break;
277          break;
278          case CurAction3d_DynamicZooming : // noting
279          break;
280          case CurAction3d_WindowZooming : // noting
281          break;
282          case CurAction3d_DynamicPanning :// noting
283          break;
284          case CurAction3d_GlobalPanning :// noting
285         break;
286         case  CurAction3d_DynamicRotation :
287                         if (!myDegenerateModeIsOn)
288                           myView->SetDegenerateModeOn();
289                         myView->StartRotation(point.x,point.y);  
290         break;
291         default :
292            Standard_Failure::Raise(" incompatible Current Mode ");
293         break;
294         }
295     }
296 }
297
298 void OCC_3dView::OnLButtonUp(UINT nFlags, CPoint point) 
299 {
300    if ( nFlags & MK_CONTROL ) 
301           {
302         return;
303           }
304         else // if ( Ctrl )
305           {
306         switch (myCurrentMode)
307         {
308          case CurAction3d_Nothing :
309          if (point.x == myXmin && point.y == myYmin)
310          { // no offset between down and up --> selectEvent
311             myXmax=point.x;  
312             myYmax=point.y;
313             if (nFlags & MK_SHIFT )
314               GetDocument()->ShiftInputEvent(point.x,point.y,myView);
315             else
316               GetDocument()->InputEvent     (point.x,point.y,myView);
317          } else
318          {
319             myXmax=point.x;    myYmax=point.y;
320             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
321                     if (nFlags & MK_SHIFT)
322                                 GetDocument()->ShiftDragEvent(point.x,point.y,1,myView);
323                         else
324                                 GetDocument()->DragEvent(point.x,point.y,1,myView);
325          }
326          break;
327          case CurAction3d_DynamicZooming :
328              // SetCursor(AfxGetApp()->LoadStandardCursor());         
329                myCurrentMode = CurAction3d_Nothing;
330          break;
331          case CurAction3d_WindowZooming :
332            myXmax=point.x;        myYmax=point.y;
333            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
334                if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
335                                          // Test if the zoom window is greater than a minimale window.
336                         {
337                           // Do the zoom window between Pmin and Pmax
338                           myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);  
339                         }  
340                myCurrentMode = CurAction3d_Nothing;
341          break;
342          case CurAction3d_DynamicPanning :
343            myCurrentMode = CurAction3d_Nothing;
344          break;
345          case CurAction3d_GlobalPanning :
346                myView->Place(point.x,point.y,myCurZoom); 
347                myCurrentMode = CurAction3d_Nothing;
348         break;
349         case  CurAction3d_DynamicRotation :
350                myCurrentMode = CurAction3d_Nothing;
351                    if (!myDegenerateModeIsOn)
352                         {  
353                           CWaitCursor aWaitCursor;
354                           myView->SetDegenerateModeOff();
355                           myDegenerateModeIsOn = Standard_False;
356                         }
357                    else
358                         {
359                           myView->SetDegenerateModeOn();
360                           myDegenerateModeIsOn = Standard_True;
361                         }
362                 break;
363         default :
364            Standard_Failure::Raise(" incompatible Current Mode ");
365         break;
366         } //switch (myCurrentMode)
367     } //        else // if ( Ctrl )
368 }
369
370 void OCC_3dView::OnMButtonDown(UINT nFlags, CPoint point) 
371 {
372    if ( nFlags & MK_CONTROL ) 
373           {
374         // Button MB2 down Control : panning init  
375         // SetCursor(AfxGetApp()->LoadStandardCursor());   
376           }
377 }
378
379 void OCC_3dView::OnMButtonUp(UINT nFlags, CPoint point) 
380 {
381    if ( nFlags & MK_CONTROL ) 
382           {
383         // Button MB2 down Control : panning init  
384         // SetCursor(AfxGetApp()->LoadStandardCursor());   
385           }
386 }
387
388 void OCC_3dView::OnRButtonDown(UINT nFlags, CPoint point) 
389 {
390    if ( nFlags & MK_CONTROL ) 
391           {
392         // SetCursor(AfxGetApp()->LoadStandardCursor());   
393             if (!myDegenerateModeIsOn)
394               myView->SetDegenerateModeOn();
395               myView->StartRotation(point.x,point.y);  
396           }
397         else // if ( Ctrl )
398           {
399             GetDocument()->Popup(point.x,point.y,myView);
400       } 
401 }
402
403 void OCC_3dView::OnRButtonUp(UINT nFlags, CPoint point) 
404 {
405     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
406     if (!myDegenerateModeIsOn)
407     {  
408       myView->SetDegenerateModeOff();
409       myDegenerateModeIsOn = Standard_False;
410     } else
411     {
412       myView->SetDegenerateModeOn();
413       myDegenerateModeIsOn = Standard_True;
414     }
415     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
416 }
417
418 void OCC_3dView::OnMouseMove(UINT nFlags, CPoint point) 
419 {
420     //   ============================  LEFT BUTTON =======================
421   if ( nFlags & MK_LBUTTON)
422     {
423      if ( nFlags & MK_CONTROL ) 
424           {
425             // move with MB1 and Control : on the dynamic zooming  
426             // Do the zoom in function of mouse's coordinates  
427             myView->Zoom(myXmax,myYmax,point.x,point.y); 
428             // save the current mouse coordinate in min 
429                 myXmax = point.x; 
430         myYmax = point.y;       
431           }
432           else // if ( Ctrl )
433           {
434         switch (myCurrentMode)
435         {
436          case CurAction3d_Nothing :
437                    myXmax = point.x;  myYmax = point.y;
438            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
439            if (nFlags & MK_SHIFT)               
440              GetDocument()->ShiftDragEvent(myXmax,myYmax,0,myView);
441            else
442              GetDocument()->DragEvent(myXmax,myYmax,0,myView);
443            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True);
444
445           break;
446          case CurAction3d_DynamicZooming :
447                myView->Zoom(myXmax,myYmax,point.x,point.y); 
448                // save the current mouse coordinate in min \n";
449                myXmax=point.x;  myYmax=point.y;
450          break;
451          case CurAction3d_WindowZooming :
452                    myXmax = point.x; myYmax = point.y;  
453            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
454            DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
455          break;
456          case CurAction3d_DynamicPanning :
457                    myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
458                    myXmax = point.x; myYmax = point.y;  
459          break;
460          case CurAction3d_GlobalPanning : // nothing           
461         break;
462         case  CurAction3d_DynamicRotation :
463           myView->Rotation(point.x,point.y);
464               myView->Redraw();
465         break;
466         default :
467            Standard_Failure::Raise(" incompatible Current Mode ");
468         break;
469         }//  switch (myCurrentMode)
470       }// if ( nFlags & MK_CONTROL )  else 
471     } else //   if ( nFlags & MK_LBUTTON) 
472     //   ============================  MIDDLE BUTTON =======================
473     if ( nFlags & MK_MBUTTON)
474     {
475      if ( nFlags & MK_CONTROL ) 
476           {
477                 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
478                 myXmax = point.x; myYmax = point.y;     
479
480           }
481     } else //  if ( nFlags & MK_MBUTTON)
482     //   ============================  RIGHT BUTTON =======================
483     if ( nFlags & MK_RBUTTON)
484     {
485      if ( nFlags & MK_CONTROL ) 
486           {
487          myView->Rotation(point.x,point.y);
488           }
489     }else //if ( nFlags & MK_RBUTTON)
490     //   ============================  NO BUTTON =======================
491     {  // No buttons 
492           myXmax = point.x; myYmax = point.y;   
493           if (nFlags & MK_SHIFT)
494                 GetDocument()->ShiftMoveEvent(point.x,point.y,myView);
495           else
496                 GetDocument()->MoveEvent(point.x,point.y,myView);
497    }
498 }
499
500 void OCC_3dView::DrawRectangle(const Standard_Integer  MinX    ,
501                                                             const Standard_Integer  MinY    ,
502                                         const Standard_Integer  MaxX ,
503                                                             const Standard_Integer  MaxY ,
504                                                             const Standard_Boolean  Draw , 
505                                         const LineStyle aLineStyle)
506 {
507     static int m_DrawMode;
508     if  (!m_Pen && aLineStyle ==Solid )
509         {m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;}
510     else if (!m_Pen && aLineStyle ==Dot )
511         {m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0));   m_DrawMode = R2_XORPEN;}
512     else if (!m_Pen && aLineStyle == ShortDash)
513         {m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0));    m_DrawMode = R2_XORPEN;}
514     else if (!m_Pen && aLineStyle == LongDash)
515         {m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0));      m_DrawMode = R2_NOTXORPEN;}
516     else if (aLineStyle == Default) 
517         { m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;}
518
519     CPen* aOldPen;
520     CClientDC clientDC(this);
521     if (m_Pen) aOldPen = clientDC.SelectObject(m_Pen);
522     clientDC.SetROP2(m_DrawMode);
523
524     static              Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
525     static              Standard_Boolean m_IsVisible;
526
527     if ( m_IsVisible && !Draw) // move or up  : erase at the old position 
528     {
529      clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
530      clientDC.LineTo(StoredMaxX,StoredMaxY); 
531          clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
532      m_IsVisible = false;
533     }
534
535     StoredMinX = min ( MinX, MaxX );
536     StoredMinY = min ( MinY, MaxY );
537     StoredMaxX = max ( MinX, MaxX );
538     StoredMaxY = max ( MinY, MaxY);
539
540     if (Draw) // move : draw
541     {
542      clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
543      clientDC.LineTo(StoredMaxX,StoredMaxY); 
544          clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
545      m_IsVisible = true;
546    }
547
548     if (m_Pen) clientDC.SelectObject(aOldPen);
549 }
550
551
552
553 void OCC_3dView::OnUpdateBUTTONHlrOff(CCmdUI* pCmdUI) 
554 {
555     pCmdUI->SetCheck (myDegenerateModeIsOn);
556         pCmdUI->Enable   (!myDegenerateModeIsOn);       
557 }
558
559 void OCC_3dView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI) 
560 {
561     pCmdUI->SetCheck (!myDegenerateModeIsOn);
562         pCmdUI->Enable   (myDegenerateModeIsOn);        
563 }
564
565 void OCC_3dView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
566 {
567     pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
568         pCmdUI->Enable   (myCurrentMode != CurAction3d_GlobalPanning);  
569         
570 }
571
572 void OCC_3dView::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
573 {
574     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
575         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicPanning );        
576 }
577
578 void OCC_3dView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
579 {
580     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
581         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicZooming); 
582 }
583
584 void OCC_3dView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
585 {
586     pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
587         pCmdUI->Enable   (myCurrentMode != CurAction3d_WindowZooming);  
588 }
589
590 void OCC_3dView::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
591 {
592     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
593         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
594 }
595
596 void OCC_3dView::OnModifyChangeBackground() 
597 {
598         Standard_Real R1;
599         Standard_Real G1;
600         Standard_Real B1;
601     myView->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
602         COLORREF m_clr ;
603         m_clr = RGB(R1*255,G1*255,B1*255);
604
605         CColorDialog dlgColor(m_clr);
606         if (dlgColor.DoModal() == IDOK)
607         {
608                 m_clr = dlgColor.GetColor();
609                 R1 = GetRValue(m_clr)/255.;
610                 G1 = GetGValue(m_clr)/255.;
611                 B1 = GetBValue(m_clr)/255.;
612         myView->SetBackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
613         }
614     myView->Redraw();
615 }