home *** CD-ROM | disk | FTP | other *** search
/ 3D Graphics Programming for Windows 95 / 3D_Graphics_Programming_for_Windows_95_Microsoft_1996.iso / samples / clock / mainfrm.cpp < prev    next >
C/C++ Source or Header  |  1996-07-17  |  5KB  |  250 lines

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "Stage.h"
  6. #include "clock.h"
  7. #include "MainFrm.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CMainFrame
  17.  
  18. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  19.  
  20. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  21.     //{{AFX_MSG_MAP(CMainFrame)
  22.     ON_WM_CREATE()
  23.     ON_WM_DESTROY()
  24.     ON_WM_ACTIVATEAPP()
  25.     ON_WM_PALETTECHANGED()
  26.     ON_WM_MOVE()
  27.     //}}AFX_MSG_MAP
  28. END_MESSAGE_MAP()
  29.  
  30. static UINT indicators[] =
  31. {
  32.     ID_SEPARATOR,           // status line indicator
  33.     ID_INDICATOR_CAPS,
  34.     ID_INDICATOR_NUM,
  35.     ID_INDICATOR_SCRL,
  36. };
  37.  
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CMainFrame construction/destruction
  40.  
  41. CMainFrame::CMainFrame()
  42. {
  43.     m_pScene = NULL;
  44. }
  45.  
  46. CMainFrame::~CMainFrame()
  47. {
  48. }
  49.  
  50. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  51. {
  52.     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  53.         return -1;
  54.     
  55.     // Create the 3D window
  56.     if (!m_wnd3d.Create(this, IDC_3DWND)) {
  57.         return -1;
  58.     }
  59.  
  60.     SetScene();
  61.     ASSERT(m_pScene);
  62.  
  63.     return 0;
  64. }
  65.  
  66. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  67. {
  68.     // Make the initial window a fixed size
  69.     cs.cx = 300;
  70.     cs.cy = 350;
  71.  
  72.     return CFrameWnd::PreCreateWindow(cs);
  73. }
  74.  
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CMainFrame diagnostics
  77.  
  78. #ifdef _DEBUG
  79. void CMainFrame::AssertValid() const
  80. {
  81.     CFrameWnd::AssertValid();
  82. }
  83.  
  84. void CMainFrame::Dump(CDumpContext& dc) const
  85. {
  86.     CFrameWnd::Dump(dc);
  87. }
  88.  
  89. #endif //_DEBUG
  90.  
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CMainFrame message handlers
  93.  
  94. void CMainFrame::RecalcLayout(BOOL bNotify) 
  95. {
  96.     // Rearrange the control bars and fit the 3D window in the middle
  97.     // Let the frame rearrange the control bars
  98.     CFrameWnd::RecalcLayout(bNotify);
  99.  
  100.     // Find the space that's left over
  101.     CRect rc;
  102.     RepositionBars(0,
  103.                    0xFFFF,
  104.                    IDC_3DWND,
  105.                    CWnd::reposQuery,
  106.                    &rc);
  107.     if (IsWindow(m_wnd3d.GetSafeHwnd())) {
  108.         m_wnd3d.MoveWindow(&rc, FALSE);
  109.     }
  110. }
  111.  
  112.  
  113. void CMainFrame::OnDestroy() 
  114. {
  115.     CFrameWnd::OnDestroy();
  116.     
  117.     // Delete any scene we might have
  118.     m_wnd3d.SetScene(NULL);
  119.     if (m_pScene) {
  120.         delete m_pScene;
  121.         m_pScene = NULL;
  122.     }
  123. }
  124.  
  125. void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask) 
  126. {
  127.     CFrameWnd::OnActivateApp(bActive, hTask);
  128.     
  129.     // Tell the 3D window about the new state
  130.     m_wnd3d.SendMessage(WM_ACTIVATEAPP,
  131.                         (WPARAM)bActive,
  132.                         (LPARAM)hTask);
  133. }
  134.  
  135. void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) 
  136. {
  137.     // Let the 3D window know
  138.     m_wnd3d.SendMessage(WM_PALETTECHANGED,
  139.                        pFocusWnd ? (WPARAM)pFocusWnd->GetSafeHwnd() : 0);
  140. }
  141.  
  142. void CMainFrame::OnMove(int x, int y) 
  143. {
  144.     CFrameWnd::OnMove(x, y);
  145.     
  146.     // Let the 3D window know the frame has moved
  147.     m_wnd3d.SendMessage(WM_MOVE, 0, MAKELPARAM(0, 0));
  148. }
  149.  
  150. BOOL CMainFrame::SetScene()
  151. {
  152.     // Create an initial scene
  153.     m_pScene = new C3dScene;
  154.     if (!m_pScene->Create()) return FALSE;
  155.     m_wnd3d.SetScene(m_pScene);
  156.  
  157.     // Set up the lighting
  158.     C3dDirLight dl;
  159.     dl.Create(0.8, 0.4, 0.4);
  160.     m_pScene->AddChild(&dl);
  161.     dl.SetPosition(-2, 2, -5);
  162.     dl.SetDirection(1, -1, 1);
  163.     m_pScene->SetAmbientLight(0.4, 0.4, 0.4);
  164.  
  165.     // Build clock
  166.     C3dFrame clock;
  167.     clock.Create(m_pScene);
  168.     double dSpin = -0.1;
  169.  
  170.     // Create the minute hand shaft
  171.     C3dFrame s1;
  172.     s1.Create(&clock);
  173.     C3dShape r1;
  174.     r1.CreateRod(0, 0, -0.5, 0, 0, 10, 0.4, 16);
  175.     r1.SetColor(0, 0, 1);
  176.     s1.AddChild(&r1);
  177.  
  178.     // Add big hand
  179.     CHand bighand(10);
  180.     s1.AddChild(&bighand);
  181.     bighand.SetPosition(0, 0, 0);
  182.  
  183.     // Add gear
  184.     CGear g1(1.5, 1.5, 8);
  185.     s1.AddChild(&g1);
  186.     g1.SetPosition(0, 0, 5.5);
  187.  
  188.     // Make shaft rotate
  189.     s1.SetRotation(0, 0, 1, dSpin);
  190.  
  191.     // Create the little hand shaft
  192.     C3dFrame s2;
  193.     s2.Create(&clock);
  194.     C3dShape r2;
  195.     r2.CreateRod(0, 0, 1.5, 0, 0, 4, 0.8, 16);
  196.     r2.SetColor(0, 0.7, 0);
  197.     s2.AddChild(&r2);
  198.  
  199.     // Add the big hand
  200.     CHand smhand(5);
  201.     s2.AddChild(&smhand);
  202.     smhand.SetPosition(0, 0, 1);
  203.  
  204.     // Add the gear
  205.     CGear g2(3, 0.5, 16);
  206.     s2.AddChild(&g2);
  207.     g2.SetPosition(0, 0, 3);
  208.  
  209.     // Make the shaft rotate
  210.     s2.SetRotation(0, 0, 1, dSpin/4);
  211.  
  212.     // Create the idler shaft
  213.     C3dFrame s3;
  214.     s3.Create(&clock);
  215.     C3dShape r3;
  216.     r3.CreateRod(0, 0, 2, 0, 0, 7, 0.4, 16);
  217.     r3.SetColor(0, 0, 1);
  218.     s3.AddChild(&r3);
  219.  
  220.     // Add the big gear
  221.     CGear g4(3, 0.5, 16);
  222.     s3.AddChild(&g4);
  223.     g4.SetPosition(0, 0, 6);
  224.  
  225.     // Add the small gear
  226.     CGear g3(1.5, 1.5, 8);
  227.     s3.AddChild(&g3);
  228.     g3.SetPosition(0, 0, 2.5);
  229.  
  230.     // Make the shaft rotate
  231.     s3.SetRotation(0, 0, 1, -dSpin/2);
  232.     s3.SetPosition(0, 4.5, 0);
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.     m_pScene->SetBackground(0.75, 0.75, 0.75);
  241.     m_pScene->SetCameraPosition(C3dVector(0, 0, -25));
  242.     clock.SetRotation(0, 1, 0, dSpin/10);
  243.  
  244.     return TRUE;
  245. }
  246.  
  247. BOOL CMainFrame::Update(double d)
  248. {
  249.     return m_wnd3d.Update(TRUE);
  250. }