首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

基于MFC的dialog的OpenGL,该怎么处理

2012-02-08 
基于MFC的dialog的OpenGLC/C++ code#include stdafx.h#include mydig.h#include OpenGL.h#ifdef _DE

基于MFC的dialog的OpenGL

C/C++ code
#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();        }    }} 



这样写为什么窗口是黑色 不显示图像?哪里没有设置 还是哪里错了 ?


[解决办法]
楼主是想把opengl显示先对话框的什么控件上?
[解决办法]
你可以先画面上什么都不要显示

只将屏幕背景色设置成其他颜色,看有没有效果

热点排行