MyglWnd.cpp
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // MyglWnd.cpp : implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "glOOP.h"
  21. #include "MyColorPaletteWnd.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CMyglWnd
  29. IMPLEMENT_DYNAMIC(CMyglWnd, CWnd)
  30. CMyglWnd::CMyglWnd()
  31. {
  32. // Initialize our class variables
  33. m_pDC = NULL;
  34. m_hRC = NULL;
  35. // Set our camera to Orthographic view and
  36. // initialize our camera variables
  37. m_Camera.m_bPerspective = FALSE;
  38. m_Camera.m_fOrigin[X] =   0.0f;
  39. m_Camera.m_fOrigin[Y] =   0.0f;
  40. m_Camera.m_fOrigin[Z] = 220.0f;
  41. m_Camera.m_fRotation[X] =  30.0f;
  42. m_Camera.m_fRotation[Y] = 225.0f;
  43. m_Camera.m_fRotation[Z] =   0.0f;
  44. m_Camera.m_fNear =   0.0f;
  45. m_Camera.m_fFar  = 300.0f;
  46. }
  47. CMyglWnd::~CMyglWnd()
  48. {
  49. }
  50. BEGIN_MESSAGE_MAP(CMyglWnd, CWnd)
  51. //{{AFX_MSG_MAP(CMyglWnd)
  52. ON_WM_ERASEBKGND()
  53. ON_WM_SIZE()
  54. ON_WM_CREATE()
  55. ON_WM_PALETTECHANGED()
  56. ON_WM_QUERYNEWPALETTE()
  57. ON_WM_DESTROY()
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. BOOL CMyglWnd::Create(DWORD dwExStyle, LPCTSTR lpszClassName,
  61. LPCTSTR lpszWindowName, DWORD dwStyle,
  62. const RECT& rect, CWnd* pParentWnd, UINT nID,
  63. CCreateContext* pContext) 
  64. {
  65. return CreateEx(dwExStyle, // Extended Style
  66. lpszClassName, // Class Name
  67. lpszWindowName, // Window Name
  68. dwStyle, // Style
  69. rect.left, // x position
  70. rect.top, // y position
  71. rect.right - rect.left, // window width
  72. rect.bottom - rect.top, // window height
  73. pParentWnd->GetSafeHwnd(), // hwndParent
  74. NULL, // hMenu
  75. NULL); // lpCreateParams
  76. }
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CMyglWnd message handlers
  79. BOOL CMyglWnd::PreCreateWindow(CREATESTRUCT& cs) 
  80. {
  81. // OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS and must not
  82.     // include CS_PARENTDC for the class style. Refer to SetPixelFormat
  83.     // documentation in the "Comments" section for further information.
  84. cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
  85. return CWnd::PreCreateWindow(cs);
  86. }
  87. int CMyglWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  88. {
  89. if (CWnd::OnCreate(lpCreateStruct) == -1)
  90. return -1;
  91. // Get the Device context to our window
  92. m_pDC = new CClientDC (this);
  93. if (m_pDC == NULL)
  94. return (-1);
  95. // Set our window pixel format for openGL rendering
  96. if(!the3dEngine.SetWindowPixelFormat(m_pDC->GetSafeHdc(),
  97.  PFD_DRAW_TO_WINDOW | // Draw to Window (not bitmap)
  98.  PFD_SUPPORT_OPENGL | // Support OpenGL calls in window
  99.  PFD_DOUBLEBUFFER)) // Double buffered mode
  100. return -1;
  101. // Create the rendering context
  102. m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
  103. if (!m_hRC)
  104. return -1;
  105. // Enable the window
  106. EnableWindow(TRUE);
  107. return 0;
  108. }
  109. void CMyglWnd::OnDestroy() 
  110. {
  111. // Clean up rendering context stuff
  112. if(m_pDC)
  113. delete m_pDC;
  114. // Clean up rendering context stuff
  115. if(m_hRC)
  116. wglDeleteContext(m_hRC);
  117. CWnd::OnDestroy();
  118. }
  119. BOOL CMyglWnd::OnEraseBkgnd(CDC* pDC) 
  120. {
  121. // Override to keep the background from being erased
  122. // everytime the window is repainted
  123. return FALSE;
  124. // return CWnd::OnEraseBkgnd(pDC);
  125. }
  126. void CMyglWnd::OnSize(UINT nType, int cx, int cy) 
  127. {
  128. CWnd::OnSize(nType, cx, cy);
  129. // Ensure that we have valid window size parameters
  130. if(!cx && !cy)
  131. return;
  132. // Make this view the current OpenGL rendering context...
  133. if(!the3dEngine.EnableRC(m_pDC->GetSafeHdc(), m_hRC, TRUE))
  134. return;
  135. // Reset our camera view
  136. m_Camera.ResetView(cx, cy);
  137. // Releases the device context that is used by the rendering context
  138. // to allow other rendering contexts to co-exist.
  139. the3dEngine.EnableRC(NULL, NULL, FALSE);
  140. // Repaint, forces remap of palette in current window
  141. InvalidateRect(NULL, FALSE);
  142. }
  143. void CMyglWnd::OnPaletteChanged(CWnd* pFocusWnd) 
  144. {
  145. HPALETTE hPaletteOld; // Handle to the old palette
  146. int iNumEntries; // Number of entries in the logical palette were
  147. // mapped to different entries in the system palette.
  148. if((the3dEngine.GetPalette() != NULL) && (pFocusWnd != this))
  149. {
  150. // Select the palette into the device context
  151. hPaletteOld = SelectPalette(m_pDC->GetSafeHdc(), the3dEngine.GetPalette(), FALSE);
  152. // Map entries from the currently selected palette to
  153. // the system palette.  The return value is the number 
  154. // of palette entries modified.
  155. iNumEntries = RealizePalette(m_pDC->GetSafeHdc());
  156. // Remap the current colors to the newly realized palette
  157. UpdateColors(m_pDC->GetSafeHdc());
  158. return;
  159. }
  160. CWnd::OnPaletteChanged(pFocusWnd);
  161. }
  162. BOOL CMyglWnd::OnQueryNewPalette() 
  163. {
  164. HPALETTE hPaletteOld; // Handle to the old palette
  165. int iNumEntries; // Number of entries in the logical palette were
  166. // mapped to different entries in the system palette.
  167. // If the palette was created.
  168. if(the3dEngine.GetPalette())
  169. {
  170. // Selects the palette into the current device context
  171. hPaletteOld = SelectPalette(m_pDC->GetSafeHdc(), the3dEngine.GetPalette(), FALSE);
  172. // Map entries from the currently selected palette to
  173. // the system palette.  The return value is the number 
  174. // of palette entries modified.
  175. iNumEntries = RealizePalette(m_pDC->GetSafeHdc());
  176. // Repaint, forces remap of palette in current window
  177. InvalidateRect(NULL, FALSE);
  178. return iNumEntries;
  179. }
  180. return CWnd::OnQueryNewPalette();
  181. }