基于MFC的dlg的OpenGL出现的问题
程序代码:
#include "stdafx.h" #include "mydig.h" #include "OpenGL.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COpenGL COpenGL::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_MAP END_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 handlers int 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(); } } }这样写为什么窗口是黑色 不显示图像?哪里没有设置 还是哪里错了 ?
求高手指点啊 谁有在dlg框架下的 OpenGL 需要自己设定opengl绘图窗口 而且能在其他地方添加控件 多谢 邮箱:redhatskk@
[ 本帖最后由 rehatskk 于 2010-3-26 17:25 编辑 ]