CGL.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // cgl.cpp :
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12. #include <windows.h>
  13. #include "util.h"
  14. #include "cgl.h"
  15. /////////////////////////////////////////////////////////////////////////////
  16. // Constructor
  17. CGL::CGL()
  18. {
  19. m_hrc = NULL;
  20. m_hdc = NULL;
  21. m_hPal = NULL;
  22. m_hOldPal = NULL;
  23. }
  24. /////////////////////////////////////////////////////////////////////////////
  25. // Destructor
  26. CGL::~CGL()
  27. {
  28. Destroy();
  29. }
  30. /////////////////////////////////////////////////////////////////////////////
  31. // Destroy
  32. void CGL::Destroy()
  33. {
  34. if (m_hOldPal)
  35. {
  36. // Select in old palette.
  37. ::SelectPalette(m_hdc, m_hOldPal, 0);
  38. m_hOldPal = NULL;
  39. }
  40. if (m_hPal)
  41. {
  42. // Delete palette.
  43. ::DeleteObject(m_hPal);
  44. m_hPal = NULL;
  45. }
  46. if (m_hrc)
  47. {
  48. // Delete rendering context.
  49. if (m_hrc == wglGetCurrentContext())
  50. wglMakeCurrent(NULL,NULL);
  51. wglDeleteContext(m_hrc);
  52. m_hrc = NULL;
  53. }
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. //  Create: use PFD_DRAW_TO_BITMAP
  57. BOOL CGL::Create(HDC hdcMemory, int iPixelType, DWORD dwFlags)
  58. {
  59. m_hdc = hdcMemory;
  60. HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hdcMemory, OBJ_BITMAP);
  61. BITMAP bmInfo;
  62. ::GetObject(hBitmap, sizeof(BITMAP), &bmInfo);
  63. ASSERT(bmInfo.bmPlanes == 1);
  64. ASSERT((bmInfo.bmBitsPixel == 8) || (bmInfo.bmBitsPixel == 16)
  65. || (bmInfo.bmBitsPixel == 24));
  66. // Fill in the Pixel Format Descriptor
  67. PIXELFORMATDESCRIPTOR pfd;
  68.    memset(&pfd,0, sizeof(PIXELFORMATDESCRIPTOR));
  69.    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  70.    pfd.nVersion = 1;                            // Version number
  71.    pfd.dwFlags =  dwFlags;
  72.    pfd.iPixelType = iPixelType;
  73.    pfd.cColorBits = (BYTE)bmInfo.bmBitsPixel;
  74.    pfd.cDepthBits = 32;                     // 32-bit depth buffer
  75.    pfd.iLayerType = PFD_MAIN_PLANE;         // Layer type
  76. ASSERT( (dwFlags & PFD_DRAW_TO_BITMAP));
  77. ASSERT( !(dwFlags & PFD_DOUBLEBUFFER));
  78. ASSERT( (iPixelType == PFD_TYPE_RGBA) ||
  79. (iPixelType == PFD_TYPE_COLORINDEX));
  80. // Chose the pixel format.
  81. int nPixelFormat = ::ChoosePixelFormat(m_hdc, &pfd);
  82. if (nPixelFormat == 0)
  83. {
  84. TRACE("ChoosePixelFormat Failed %drn",GetLastError());
  85. return FALSE;
  86. }
  87. TRACE("Pixel Format %drn", nPixelFormat);
  88. // Set the pixel format.
  89. BOOL bResult = ::SetPixelFormat(m_hdc, nPixelFormat, &pfd);
  90. if (!bResult)
  91. {
  92. TRACE("SetPixelFormat Failed %drn",GetLastError());
  93. return FALSE;
  94. }
  95. // Create the palette
  96. CreatePalette();
  97. // Create a rendering context.
  98. m_hrc = ::wglCreateContext(m_hdc);
  99. if (!m_hrc)
  100. {
  101. TRACE("wglCreateContext Failed %xrn", GetLastError());
  102. return FALSE;
  103. }
  104. // Window size is 0,0 here. Don't wglMakeCurrent.
  105. // wglMakeCurrent will be called in Resize
  106. // A dibsection should set the color palette after this call.
  107. //  m_pDibSurf->SetPalette(m_pPal); // DIBSECTION
  108. //  if (m_pPal) setPaletteDIB();
  109. return TRUE;
  110. }
  111. /////////////////////////////////////////////////////////////////////////////
  112. // Helper Functions
  113. // MakeCurrent
  114. void CGL::MakeCurrent()
  115. {
  116. ASSERT(m_hrc);
  117. ASSERT(m_hdc);
  118. if (m_hrc != ::wglGetCurrentContext())
  119. {
  120. // Make the rendering context m_hrc current
  121. BOOL bResult = ::wglMakeCurrent(m_hdc, m_hrc);
  122. ASSERT(bResult);
  123. }
  124. }
  125. /////////////////////////////////////////////////////////////////////////////
  126. // IsCurrent
  127. BOOL CGL::IsCurrent()
  128. {
  129. return ( (m_hrc == wglGetCurrentContext()) &&
  130.  (m_hdc == wglGetCurrentDC()) );
  131. }
  132. /////////////////////////////////////////////////////////////////////////////
  133. //  OutputGlError
  134. void CGL::OutputGlError(char* label)
  135. {
  136. GLenum errorno = glGetError();
  137. if (errorno != GL_NO_ERROR)
  138. {
  139. assert(0);
  140. }
  141. }