0024355: Compiler Warning level 4 for MFC samples
[occt.git] / samples / mfc / standard / 10_Convert / src / WNT / OCCDemoView.cpp
1 // OCCDemoView.cpp : implementation of the COCCDemoView class
2 //
3
4 #include "stdafx.h"
5 #include "MainFrm.h"
6 #include "OCCDemo.h"
7 #include "OCCDemoDoc.h"
8 #include "OCCDemoView.h"
9
10 #include <Graphic3d_GraphicDriver.hxx>
11
12 #define ValZWMin 1
13
14 #ifdef _DEBUG
15 #undef THIS_FILE
16 static char THIS_FILE[] = __FILE__;
17 #endif
18
19 /////////////////////////////////////////////////////////////////////////////
20 // COCCDemoView
21
22 IMPLEMENT_DYNCREATE(COCCDemoView, CView)
23
24 BEGIN_MESSAGE_MAP(COCCDemoView, CView)
25         //{{AFX_MSG_MAP(COCCDemoView)
26         ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo)
27         ON_COMMAND(ID_BUTTONBack, OnBUTTONBack)
28         ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom)
29         ON_COMMAND(ID_BUTTONFront, OnBUTTONFront)
30         ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn)
31         ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft)
32         ON_COMMAND(ID_BUTTONPan, OnBUTTONPan)
33         ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo)
34         ON_COMMAND(ID_BUTTONReset, OnBUTTONReset)
35         ON_COMMAND(ID_BUTTONRight, OnBUTTONRight)
36         ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
37         ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
38         ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
39         ON_WM_SIZE()
40         ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
41         ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin)
42         ON_WM_LBUTTONDOWN()
43         ON_WM_LBUTTONUP()
44         ON_WM_MOUSEMOVE()
45         ON_WM_RBUTTONDOWN()
46         ON_WM_RBUTTONUP()
47         ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
48         ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
49         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
50         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
51         ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
52         ON_COMMAND(ID_BUTTONWire, OnBUTTONWire)
53         ON_COMMAND(ID_BUTTONShade, OnBUTTONShade)
54         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
55         ON_UPDATE_COMMAND_UI(ID_BUTTONShade, OnUpdateBUTTONShade)
56         ON_UPDATE_COMMAND_UI(ID_BUTTONWire, OnUpdateBUTTONWire)
57         //}}AFX_MSG_MAP
58 END_MESSAGE_MAP()
59
60 /////////////////////////////////////////////////////////////////////////////
61 // COCCDemoView construction/destruction
62
63 COCCDemoView::COCCDemoView()
64 {
65   myXmin=0;
66   myYmin=0;  
67   myXmax=0;
68   myYmax=0;
69   myCurZoom=0;
70   myCurrentMode = CurAction3d_Nothing;
71   myVisMode = VIS_SHADE;
72   m_Pen = NULL;
73   myGraphicDriver = ((COCCDemoApp*)AfxGetApp())->GetGraphicDriver();
74 }
75
76 COCCDemoView::~COCCDemoView()
77 {
78         if (!myView.IsNull())
79     myView->Remove();
80   if (m_Pen)
81     delete m_Pen;
82 }
83
84 BOOL COCCDemoView::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 // COCCDemoView drawing
94
95 void COCCDemoView::OnInitialUpdate() 
96 {
97   CView::OnInitialUpdate();
98   
99   myView = GetDocument()->GetViewer()->CreateView();
100
101   Handle(WNT_Window) aWNTWindow = new WNT_Window(GetSafeHwnd ());
102   myView->SetWindow(aWNTWindow);
103   if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
104
105   myCurrentMode = CurAction3d_Nothing;
106   myVisMode = VIS_SHADE;
107   RedrawVisMode();
108 }
109
110 void COCCDemoView::OnDraw(CDC* /*pDC*/)
111 {
112         COCCDemoDoc* pDoc = GetDocument();
113         ASSERT_VALID(pDoc);
114         // TODO: add draw code for native data here
115   myView->Redraw();
116 }
117
118 /////////////////////////////////////////////////////////////////////////////
119 // COCCDemoView diagnostics
120
121 #ifdef _DEBUG
122 void COCCDemoView::AssertValid() const
123 {
124         CView::AssertValid();
125 }
126
127 void COCCDemoView::Dump(CDumpContext& dc) const
128 {
129         CView::Dump(dc);
130 }
131
132 COCCDemoDoc* COCCDemoView::GetDocument() // non-debug version is inline
133 {
134         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COCCDemoDoc)));
135         return (COCCDemoDoc*)m_pDocument;
136 }
137 #endif //_DEBUG
138
139 /////////////////////////////////////////////////////////////////////////////
140 // COCCDemoView message handlers
141
142 void COCCDemoView::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/) 
143 {
144   if (!myView.IsNull())
145     myView->MustBeResized();
146 }
147
148 void COCCDemoView::OnBUTTONBack() 
149
150   myView->SetProj(V3d_Ypos);
151 }
152
153 void COCCDemoView::OnBUTTONFront() 
154
155         myView->SetProj(V3d_Yneg);
156 }
157
158 void COCCDemoView::OnBUTTONBottom() 
159
160         myView->SetProj(V3d_Zneg); 
161 }
162
163 void COCCDemoView::OnBUTTONTop() 
164
165         myView->SetProj(V3d_Zpos); 
166 }
167
168 void COCCDemoView::OnBUTTONLeft() 
169
170         myView->SetProj(V3d_Xneg);
171 }
172
173 void COCCDemoView::OnBUTTONRight() 
174
175         myView->SetProj(V3d_Xpos);
176 }
177
178 void COCCDemoView::OnBUTTONAxo() 
179
180         myView->SetProj(V3d_XposYnegZpos); 
181 }
182
183 void COCCDemoView::OnBUTTONPan() 
184 {
185   myCurrentMode = CurAction3d_DynamicPanning;
186 }
187
188 void COCCDemoView::OnBUTTONPanGlo() 
189 {
190   // save the current zoom value 
191   myCurZoom = myView->Scale();
192   // Do a Global Zoom 
193   myView->FitAll();
194   // Set the mode 
195   myCurrentMode = CurAction3d_GlobalPanning;
196 }
197
198 void COCCDemoView::OnBUTTONReset() 
199 {
200   myView->Reset();
201 }
202
203 void COCCDemoView::OnBUTTONRot() 
204 {
205   myCurrentMode = CurAction3d_DynamicRotation;
206 }
207
208 void COCCDemoView::OnBUTTONZoomAll() 
209 {
210   myView->FitAll();
211   myView->ZFitAll();
212 }
213
214 void COCCDemoView::OnBUTTONZoomProg() 
215 {
216   myCurrentMode = CurAction3d_DynamicZooming;
217 }
218
219 void COCCDemoView::OnBUTTONZoomWin() 
220 {
221   myCurrentMode = CurAction3d_WindowZooming;
222 }
223
224 void COCCDemoView::OnLButtonDown(UINT nFlags, CPoint point) 
225 {
226   //  save the current mouse coordinate in min 
227   myXmin=point.x;  myYmin=point.y;
228   myXmax=point.x;  myYmax=point.y;
229   
230   if ( ! (nFlags & MK_CONTROL) ) 
231   {
232     if (myCurrentMode == CurAction3d_DynamicRotation)
233     {
234       myView->SetComputedMode(Standard_False);
235       myView->StartRotation(point.x,point.y);  
236     }
237   }
238 }
239
240 void COCCDemoView::OnLButtonUp(UINT nFlags, CPoint point) 
241 {
242   if ( !(nFlags & MK_CONTROL) )
243   {
244     switch (myCurrentMode)
245     {
246     case CurAction3d_Nothing :
247       myXmax=point.x;  
248       myYmax=point.y;
249       break;
250     case CurAction3d_DynamicZooming :
251       myCurrentMode = CurAction3d_Nothing;
252       break;
253     case CurAction3d_WindowZooming :
254       DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
255       myXmax=point.x;
256       myYmax=point.y;
257       if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
258         // Test if the zoom window is greater than a minimale window.
259       {
260         // Do the zoom window between Pmin and Pmax
261         myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);  
262       }  
263       myCurrentMode = CurAction3d_Nothing;
264       break;
265     case CurAction3d_DynamicPanning :
266       myCurrentMode = CurAction3d_Nothing;
267       break;
268     case CurAction3d_GlobalPanning :
269       myView->Place(point.x,point.y,myCurZoom); 
270       myCurrentMode = CurAction3d_Nothing;
271       break;
272     case  CurAction3d_DynamicRotation :
273       if (myVisMode == VIS_HLR)
274       {
275         SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
276         myView->SetComputedMode(Standard_True);
277         SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
278       }
279       myCurrentMode = CurAction3d_Nothing;
280       break;
281     } //switch (myCurrentMode)
282   }
283 }
284
285 void COCCDemoView::OnRButtonDown(UINT nFlags, CPoint point) 
286 {
287   if ( nFlags & MK_CONTROL ) 
288   {
289     myView->SetComputedMode(Standard_False);
290     myView->StartRotation(point.x,point.y);  
291   }
292 }
293
294 void COCCDemoView::OnRButtonUp(UINT /*nFlags*/, CPoint /*point*/) 
295 {
296   if (myVisMode == VIS_HLR)
297   {
298     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
299     myView->SetComputedMode(Standard_True);
300     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
301   }
302 }
303
304 void COCCDemoView::OnMouseMove(UINT nFlags, CPoint point) 
305 {
306   //   ============================  LEFT BUTTON =======================
307   if ( nFlags & MK_LBUTTON)
308   {
309     if ( nFlags & MK_CONTROL ) 
310     {
311       // move with MB1 and Control : on the dynamic zooming  
312       // Do the zoom in function of mouse's coordinates  
313       myView->Zoom(myXmax,myYmax,point.x,point.y); 
314       // save the current mouse coordinate in max
315       myXmax = point.x; 
316       myYmax = point.y; 
317     }
318     else // if ( Ctrl )
319     {
320       switch (myCurrentMode)
321       {
322       case CurAction3d_Nothing :
323         myXmax = point.x;
324         myYmax = point.y;
325         break;
326       case CurAction3d_DynamicZooming :
327         myView->Zoom(myXmax,myYmax,point.x,point.y); 
328         // save the current mouse coordinate in max;
329         myXmax=point.x;
330         myYmax=point.y;
331         break;
332       case CurAction3d_WindowZooming :
333         myXmax = point.x; myYmax = point.y;     
334         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
335         DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
336         break;
337       case CurAction3d_DynamicPanning :
338         myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
339         myXmax = point.x; myYmax = point.y;     
340         break;
341       case CurAction3d_GlobalPanning : // nothing           
342         break;
343       case  CurAction3d_DynamicRotation :
344         myView->Rotation(point.x,point.y);
345         myView->Redraw();
346         break;
347       }
348     }
349   }
350   //   ============================  MIDDLE BUTTON =======================
351   else if ( nFlags & MK_MBUTTON)
352   {
353     if ( nFlags & MK_CONTROL ) 
354     {
355       myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
356       myXmax = point.x; myYmax = point.y;       
357     }
358   }
359   //   ============================  RIGHT BUTTON =======================
360   else if ( nFlags & MK_RBUTTON)
361   {
362     if ( nFlags & MK_CONTROL ) 
363     {
364       myView->Rotation(point.x,point.y);
365     }
366   }
367   //   ============================  NO BUTTON =======================
368   else
369   {
370     myXmax = point.x;
371     myYmax = point.y;   
372   }
373 }
374
375 void COCCDemoView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
376 {
377   pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
378         pCmdUI->Enable   (myCurrentMode != CurAction3d_GlobalPanning);  
379 }
380
381 void COCCDemoView::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
382 {
383   pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
384         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicPanning );        
385 }
386
387 void COCCDemoView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
388 {
389   pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
390         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicZooming); 
391 }
392
393 void COCCDemoView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
394 {
395   pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
396         pCmdUI->Enable   (myCurrentMode != CurAction3d_WindowZooming);  
397 }
398
399 void COCCDemoView::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
400 {
401   pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
402         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
403 }
404
405 void COCCDemoView::DrawRectangle(const Standard_Integer  MinX,
406                                         const Standard_Integer  MinY,
407                                         const Standard_Integer  MaxX,
408                                         const Standard_Integer  MaxY,
409                                         const Standard_Boolean  Draw, 
410                                         const LineStyle aLineStyle)
411 {
412   static int m_DrawMode;
413   if  (!m_Pen && aLineStyle ==Solid )
414   {
415     m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;
416   }
417   else if (!m_Pen && aLineStyle ==Dot )
418   {
419     m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0));   m_DrawMode = R2_XORPEN;
420   }
421   else if (!m_Pen && aLineStyle == ShortDash)
422   {
423     m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0)); m_DrawMode = R2_XORPEN;
424   }
425   else if (!m_Pen && aLineStyle == LongDash)
426   {
427     m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0));   m_DrawMode = R2_NOTXORPEN;
428   }
429   else if (aLineStyle == Default) 
430   {
431     m_Pen = NULL;       m_DrawMode = R2_MERGEPENNOT;
432   }
433
434   CPen* aOldPen = NULL;
435   CClientDC clientDC(this);
436   if (m_Pen) 
437     aOldPen = clientDC.SelectObject(m_Pen);
438   clientDC.SetROP2(m_DrawMode);
439
440   static                Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
441   static                Standard_Boolean m_IsVisible = Standard_False;
442
443   if ( m_IsVisible && !Draw) // move or up  : erase at the old position 
444   {
445     clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
446     clientDC.LineTo(StoredMaxX,StoredMaxY); 
447     clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
448     m_IsVisible = false;
449   }
450
451   StoredMinX = min ( MinX, MaxX );
452   StoredMinY = min ( MinY, MaxY );
453   StoredMaxX = max ( MinX, MaxX );
454   StoredMaxY = max ( MinY, MaxY);
455
456   if (Draw) // move : draw
457   {
458     clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
459     clientDC.LineTo(StoredMaxX,StoredMaxY); 
460     clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
461     m_IsVisible = true;
462   }
463
464   if (m_Pen) 
465     clientDC.SelectObject(aOldPen);
466 }
467
468 void COCCDemoView::InitButtons()
469 {
470   myXmin=0;
471   myYmin=0;  
472   myXmax=0;
473   myYmax=0;
474   myCurZoom=0;
475   myCurrentMode = CurAction3d_Nothing;
476 }
477
478 void COCCDemoView::Reset()
479 {
480   InitButtons();
481   myVisMode = VIS_SHADE;
482   if (!myView.IsNull())
483   {
484     RedrawVisMode();
485     myView->Reset();
486   }
487 }
488
489 void COCCDemoView::RedrawVisMode()
490 {
491   switch (myVisMode)
492   {
493   case VIS_WIREFRAME:
494     GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
495     myView->SetComputedMode (Standard_False);
496     break;
497   case VIS_SHADE:
498     GetDocument()->GetAISContext()->SetDisplayMode(AIS_Shaded);
499     myView->SetComputedMode (Standard_False);
500     break;
501   case VIS_HLR:
502     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
503     myView->SetComputedMode (Standard_True);
504     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
505     GetDocument()->GetAISContext()->SetDisplayMode(AIS_WireFrame);
506     break;
507   }
508 }
509
510 void COCCDemoView::OnBUTTONWire() 
511 {
512   myVisMode = VIS_WIREFRAME;
513   RedrawVisMode();
514 }
515
516 void COCCDemoView::OnBUTTONShade() 
517 {
518   myVisMode = VIS_SHADE;
519   RedrawVisMode();
520 }
521
522 void COCCDemoView::OnBUTTONHlrOn() 
523 {
524   myVisMode = VIS_HLR;
525   RedrawVisMode();
526 }
527
528 void COCCDemoView::OnUpdateBUTTONWire(CCmdUI* pCmdUI) 
529 {
530   pCmdUI->SetCheck (myVisMode == VIS_WIREFRAME);
531         pCmdUI->Enable   (myVisMode != VIS_WIREFRAME);  
532 }
533
534 void COCCDemoView::OnUpdateBUTTONShade(CCmdUI* pCmdUI) 
535 {
536   pCmdUI->SetCheck (myVisMode == VIS_SHADE);
537         pCmdUI->Enable   (myVisMode != VIS_SHADE);      
538 }
539
540 void COCCDemoView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI) 
541 {
542   pCmdUI->SetCheck (myVisMode == VIS_HLR);
543         pCmdUI->Enable   (myVisMode != VIS_HLR);        
544 }
545
546 void COCCDemoView::GetViewCenter(V3d_Coordinate& Xc, V3d_Coordinate& Yc)
547 {
548         myView->Center(Xc,Yc);
549 }
550
551 void COCCDemoView::SetViewCenter(V3d_Coordinate Xc, V3d_Coordinate Yc)
552 {
553         myView->SetCenter(Xc,Yc);
554 }
555
556 void COCCDemoView::GetViewEye(V3d_Coordinate& X, V3d_Coordinate& Y, V3d_Coordinate& Z)
557 {
558         myView->Eye(X,Y,Z);
559 }
560
561 void COCCDemoView::SetViewEye(V3d_Coordinate X, V3d_Coordinate Y, V3d_Coordinate Z)
562 {
563         myView->SetEye(X,Y,Z);
564 }
565
566 Quantity_Factor COCCDemoView::GetViewScale()
567 {
568         return myView->Scale();
569 }
570
571 void COCCDemoView::SetViewScale(Quantity_Factor Coef)
572 {
573         myView->SetScale(Coef);
574 }