基于MFC的dialog的OpenGL
#include "stdafx.h"#include "mydig.h"#include "OpenGL.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// COpenGLCOpenGL::COpenGL(){ //给成员变量赋初值}COpenGL::~COpenGL(){ //添加函数 wglMakeCurrent(NULL, NULL) ; wglDeleteContext(hglrc); //删除渲染描述表 ::ReleaseDC (m_hWnd, hdc) ; //释放设备描述表}BEGIN_MESSAGE_MAP(COpenGL, CWnd) //{{AFX_MSG_MAP(COpenGL) ON_WM_CREATE() ON_WM_PAINT() //}}AFX_MSG_MAPEND_MESSAGE_MAP()// 设置像素格式函数int COpenGL::MySetPixelFormat(HDC hdc){ 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 iPixelFormat; // 为设备描述表得到最匹配的像素格式 if((iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0) { MessageBox("ChoosePixelFormat Failed", NULL, MB_OK); return 0; } // 设置最匹配的像素格式为当前的像素格式 if(SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE) { MessageBox("SetPixelFormat Failed", NULL, MB_OK); return 0; } return 1;}/////////////////////////////////////////////////////////////////////////////// COpenGL message handlersint COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct) { initGL(); if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here // 设置当前的绘图像素格式 MySetPixelFormat(::GetDC(m_hWnd)); // 获得绘图描述表 hdc = ::GetDC(m_hWnd); // 创建渲染描述表 hglrc = wglCreateContext(hdc); // 使绘图描述表为当前调用现程的当前绘图描述表 wglMakeCurrent(hdc, hglrc); return 0;}int COpenGL::initGL(){ InitTerrain(); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.5f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return TRUE; }void COpenGL::OnPaint() { //CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // Do not call CWnd::OnPaint() for painting messages rendscrean(); glFlush(); }int COpenGL::rendscrean(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-6.0f); gluLookAt( 75, 75, 75, 0, 0, 0, 0, 1, 0 ); DrawTerrain(); SwapBuffers(hdc); return true;}void COpenGL::InitTerrain(){ int x,z; float xi,zi; for(z=0;z<DIMZ;z++) { zi=(float)z-((float)DIMZ/2); zi=zi*SIZE; for(x=0;x<DIMX;x++) { xi=(float)x-((float)DIMX/2); xi=xi*SIZE; Terrain[x][z].x=xi; Terrain[x][z].y=0; Terrain[x][z].z=zi; } } }void COpenGL::DrawTerrain(){ int x,z; for(z=0;z<DIMZ-1;z++) { for(x=0;x<DIMX-1;x++) { glBegin(GL_QUADS); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(Terrain[x][z].x,Terrain[x][z].y,Terrain[x][z].z); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(Terrain[x][z+1].x,Terrain[x][z+1].y,Terrain[x][z+1].z); glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(Terrain[x+1][z+1].x,Terrain[x+1][z+1].y,Terrain[x+1][z+1].z); glColor3f(0.0f, 1.0f, 1.0f); glVertex3f(Terrain[x+1][z].x,Terrain[x+1][z].y,Terrain[x+1][z].z); glEnd(); } }}