基于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 编辑 ]







