1.搭载gl环境并设置项目属性 2.在stdafx.h中添加引用 // 包含有关OpenGL函数的头文件 #include <gl/gl.h> #include <gl/glu.h> #include <gl/glaux.h> #include <gl/glut.h> 3.添加变量 // OpenGL绘制描述表 HGLRC m_hRC; // OpenGL调色板 HPALETTE m_hPalette; // OpenGL设备描述表 CDC* m_pDC; 4.添加函数: private: void SetLogicalPalette(void); // 初始化openGL场景 bool InitializeOpenGL(CDC* pDC); // 设置像素格式 bool SetupPixelFormat(void); // 场景绘制与渲染 bool RenderScene(void); 5.添加代码 int CglFrameView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 ////////////////////////////////////////////////////////////////// //初始化OpenGL和设置定时器 m_pDC = new CClientDC(this); SetTimer(1, 2000, NULL); InitializeOpenGL(m_pDC); ////////////////////////////////////////////////////////////////// return 0; } BOOL CglFrameView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 //设置窗口类型 cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS; return CView::PreCreateWindow(cs); } void CglFrameView::OnDraw(CDC* /*pDC*/) { CglFrameDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 //渲染场景 RenderScene(); } void CglFrameView::OnDestroy() { CView::OnDestroy(); // TODO: 在此处添加消息处理程序代码 ///////////////////////////////////////////////////////////////// //删除调色板和渲染上下文、定时器 ::wglMakeCurrent(0,0); ::wglDeleteContext( m_hRC); if (m_hPalette) DeleteObject(m_hPalette); if ( m_pDC ) { delete m_pDC; } ///////////////////////////////////////////////////////////////// } void CglFrameView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 //添加窗口缩放时的图形变换函数 glViewport(0,0,cx,cy); } void CglFrameView::SetLogicalPalette(void) { struct { WORD Version; WORD NumberOfEntries; PALETTEENTRY aEntries[256]; } logicalPalette = { 0x300, 256 }; BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255}; BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255}; BYTE blues[] = {0, 85, 170, 255}; for (int colorNum=0; colorNum<256; ++colorNum) { logicalPalette.aEntries[colorNum].peRed = reds[colorNum & 0x07]; logicalPalette.aEntries[colorNum].peGreen = greens[(colorNum >> 0x03) & 0x07]; logicalPalette.aEntries[colorNum].peBlue = blues[(colorNum >> 0x06) & 0x03]; logicalPalette.aEntries[colorNum].peFlags = 0; } m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette); } // 初始化openGL场景 bool CglFrameView::InitializeOpenGL(CDC* pDC) { m_pDC = pDC; SetupPixelFormat(); //生成绘制描述表 m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc()); //置当前绘制描述表 ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC); return TRUE; } // 设置像素格式 bool CglFrameView::SetupPixelFormat(void) { PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小 1, // 版本号 PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图 PFD_SUPPORT_OPENGL | // 支持 OpenGL PFD_DOUBLEBUFFER, // 双缓存模式 PFD_TYPE_RGBA, // RGBA 颜色模式 24, // 24 位颜色深度 0, 0, 0, 0, 0, 0, // 忽略颜色位 0, // 没有非透明度缓存 0, // 忽略移位位 0, // 无累加缓存 0, 0, 0, 0, // 忽略累加位 32, // 32 位深度缓存 0, // 无模板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, // 主层 0, // 保留 0, 0, 0 // 忽略层,可见性和损毁掩模 }; int pixelformat; pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式 ::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式 if(pfd.dwFlags & PFD_NEED_PALETTE) SetLogicalPalette(); //设置逻辑调色板 return TRUE; } // 场景绘制与渲染 bool CglFrameView::RenderScene(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.2f, 0.6f, 1.0f); ::auxWireSphere(0.5); ::auxWireBox (0.1,0.2,0.1); ::auxWireCone (0.3,0.4); ::SwapBuffers (m_pDC->GetSafeHdc()); //交互缓冲区 return TRUE; } BOOL CglFrameView::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //return CView::OnEraseBkgnd(pDC); return true; } //OnTImer函数可以不用 void CglFrameView::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //添加定时器响应函数和场景更新函数 Invalidate(FALSE); CView::OnTimer(nIDEvent);
|