SDOpenGLView.cpp
上传用户:tengyuc
上传日期:2007-08-14
资源大小:722k
文件大小:8k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // SDOpenGLView.cpp : implementation of the CSDOpenGLView class
  2. //
  3. #include "stdafx.h"
  4. #include "SDOpenGL.h"
  5. #include "SDOpenGLDoc.h"
  6. #include "SDOpenGLView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CSDOpenGLView
  14. IMPLEMENT_DYNCREATE(CSDOpenGLView, CView)
  15. BEGIN_MESSAGE_MAP(CSDOpenGLView, CView)
  16. //{{AFX_MSG_MAP(CSDOpenGLView)
  17. ON_WM_CREATE()
  18. ON_WM_DESTROY()
  19. ON_WM_SIZE()
  20. ON_WM_TIMER()
  21. //}}AFX_MSG_MAP
  22. // Standard printing commands
  23. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  24. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  25. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CSDOpenGLView construction/destruction
  29. CSDOpenGLView::CSDOpenGLView()
  30. {
  31. // TODO: add construction code here
  32. }
  33. CSDOpenGLView::~CSDOpenGLView()
  34. {
  35. }
  36. BOOL CSDOpenGLView::PreCreateWindow(CREATESTRUCT& cs)
  37. {
  38. // TODO: Modify the Window class or styles here by modifying
  39. //  the CREATESTRUCT cs
  40. ////////////////////////////////////////////////////////////////
  41. //设置窗口类型
  42. cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
  43. ////////////////////////////////////////////////////////////////
  44. return CView::PreCreateWindow(cs);
  45. }
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CSDOpenGLView drawing
  48. void CSDOpenGLView::OnDraw(CDC* pDC)
  49. {
  50. CSDOpenGLDoc* pDoc = GetDocument();
  51. ASSERT_VALID(pDoc);
  52. // TODO: add draw code for native data here
  53. //////////////////////////////////////////////////////////////////
  54. RenderScene(); //渲染场景
  55. //////////////////////////////////////////////////////////////////
  56. }
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CSDOpenGLView printing
  59. BOOL CSDOpenGLView::OnPreparePrinting(CPrintInfo* pInfo)
  60. {
  61. // default preparation
  62. return DoPreparePrinting(pInfo);
  63. }
  64. void CSDOpenGLView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  65. {
  66. // TODO: add extra initialization before printing
  67. }
  68. void CSDOpenGLView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  69. {
  70. // TODO: add cleanup after printing
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CSDOpenGLView diagnostics
  74. #ifdef _DEBUG
  75. void CSDOpenGLView::AssertValid() const
  76. {
  77. CView::AssertValid();
  78. }
  79. void CSDOpenGLView::Dump(CDumpContext& dc) const
  80. {
  81. CView::Dump(dc);
  82. }
  83. CSDOpenGLDoc* CSDOpenGLView::GetDocument() // non-debug version is inline
  84. {
  85. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSDOpenGLDoc)));
  86. return (CSDOpenGLDoc*)m_pDocument;
  87. }
  88. #endif //_DEBUG
  89. /////////////////////////////////////////////////////////////////////////////
  90. // CSDOpenGLView message handlers
  91. int CSDOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  92. {
  93. if (CView::OnCreate(lpCreateStruct) == -1)
  94. return -1;
  95. // TODO: Add your specialized creation code here
  96. //////////////////////////////////////////////////////////////////
  97. //初始化OpenGL和设置定时器
  98. m_pDC = new CClientDC(this);
  99. SetTimer(1, 20, NULL);
  100. InitializeOpenGL(m_pDC);
  101. //////////////////////////////////////////////////////////////////
  102. return 0;
  103. }
  104. void CSDOpenGLView::OnDestroy() 
  105. {
  106. CView::OnDestroy();
  107. // TODO: Add your message handler code here
  108. /////////////////////////////////////////////////////////////////
  109. //删除调色板和渲染上下文、定时器
  110. ::wglMakeCurrent(0,0);
  111. ::wglDeleteContext( m_hRC);
  112. if (m_hPalette)
  113.     DeleteObject(m_hPalette);
  114. if ( m_pDC )
  115. {
  116. delete m_pDC;
  117. }
  118. KillTimer(1);
  119. /////////////////////////////////////////////////////////////////
  120. }
  121. void CSDOpenGLView::OnSize(UINT nType, int cx, int cy) 
  122. {
  123. CView::OnSize(nType, cx, cy);
  124. // TODO: Add your message handler code here
  125. /////////////////////////////////////////////////////////////////
  126. //添加窗口缩放时的图形变换函数
  127. glViewport(0,0,cx,cy);
  128. /////////////////////////////////////////////////////////////////
  129. }
  130. void CSDOpenGLView::OnTimer(UINT nIDEvent) 
  131. {
  132. // TODO: Add your message handler code here and/or call default
  133. /////////////////////////////////////////////////////////////////
  134. //添加定时器响应函数和场景更新函数
  135. Invalidate(FALSE);
  136. /////////////////////////////////////////////////////////////////
  137. CView::OnTimer(nIDEvent);
  138. }
  139. /////////////////////////////////////////////////////////////////////
  140. //                   设置逻辑调色板
  141. //////////////////////////////////////////////////////////////////////
  142. void CSDOpenGLView::SetLogicalPalette(void)
  143. {
  144.     struct
  145.     {
  146.         WORD Version;
  147.         WORD NumberOfEntries;
  148.         PALETTEENTRY aEntries[256];
  149.     } logicalPalette = { 0x300, 256 };
  150. BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
  151. BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
  152. BYTE blues[] = {0, 85, 170, 255};
  153.     for (int colorNum=0; colorNum<256; ++colorNum)
  154.     {
  155.         logicalPalette.aEntries[colorNum].peRed =
  156.             reds[colorNum & 0x07];
  157.         logicalPalette.aEntries[colorNum].peGreen =
  158.             greens[(colorNum >> 0x03) & 0x07];
  159.         logicalPalette.aEntries[colorNum].peBlue =
  160.             blues[(colorNum >> 0x06) & 0x03];
  161.         logicalPalette.aEntries[colorNum].peFlags = 0;
  162.     }
  163.     m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
  164. }
  165. //////////////////////////////////////////////////////////
  166. // 初始化openGL场景
  167. //////////////////////////////////////////////////////////
  168. BOOL CSDOpenGLView::InitializeOpenGL(CDC* pDC)
  169. {
  170. m_pDC = pDC;
  171. SetupPixelFormat();
  172. //生成绘制描述表
  173. m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
  174. //置当前绘制描述表
  175. ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
  176. return TRUE;
  177. }
  178. //////////////////////////////////////////////////////////
  179. // 设置像素格式
  180. //////////////////////////////////////////////////////////
  181. BOOL CSDOpenGLView::SetupPixelFormat()
  182. {
  183. PIXELFORMATDESCRIPTOR pfd = { 
  184.     sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小 
  185.     1,                                // 版本号 
  186.     PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图 
  187.     PFD_SUPPORT_OPENGL |              // 支持 OpenGL 
  188.     PFD_DOUBLEBUFFER,                 // 双缓存模式 
  189.     PFD_TYPE_RGBA,                    // RGBA 颜色模式 
  190.     24,                               // 24 位颜色深度 
  191.     0, 0, 0, 0, 0, 0,                 // 忽略颜色位 
  192.     0,                                // 没有非透明度缓存 
  193.     0,                                // 忽略移位位 
  194.     0,                                // 无累加缓存 
  195.     0, 0, 0, 0,                       // 忽略累加位 
  196.     32,                               // 32 位深度缓存     
  197.     0,                                // 无模板缓存 
  198.     0,                                // 无辅助缓存 
  199.     PFD_MAIN_PLANE,                   // 主层 
  200.     0,                                // 保留 
  201.     0, 0, 0                           // 忽略层,可见性和损毁掩模 
  202. }; 
  203. int pixelformat;
  204. pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式
  205. ::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式
  206. if(pfd.dwFlags & PFD_NEED_PALETTE)
  207. SetLogicalPalette(); //设置逻辑调色板
  208. return TRUE;
  209. }
  210. //////////////////////////////////////////////////////////
  211. // 场景绘制与渲染
  212. //////////////////////////////////////////////////////////
  213. BOOL CSDOpenGLView::RenderScene() 
  214. {
  215.     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  216.     glClear(GL_COLOR_BUFFER_BIT);
  217.     glColor3f(0.2f, 0.6f, 1.0f);
  218. auxWireSphere(0.5);
  219. ::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区
  220. return TRUE;
  221. }