标题:基于MFC的dlg的OpenGL出现的问题
只看楼主
rehatskk
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-3-26
结帖率:100%
已结贴  问题点数:20 回复次数:3 
基于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 编辑 ]
搜索更多相关主题的帖子: OpenGL MFC dlg 
2010-03-26 17:22
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
得分:20 
http://
2010-03-26 17:31
rehatskk
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-3-26
得分:0 
这个也是随着绘图窗口的变化 图形也变化
好像跟NeHe中的像素单位量不一样了 请问怎么设置?
2010-03-26 22:28
rehatskk
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-3-26
得分:0 
他是这样绘制三角形的glBegin(GL_TRIANGLES);
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f(1.0f,-1.0f,0.0f);
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f(-1.0f,-1.0f,0.0f);
        glColor3f(0.0f,0.0f,1.0f);
        glVertex3f(0.0f,1.0f,0.0f);     / /
    glEnd();
如果我这样就超出显示范围了
glBegin(GL_TRIANGLES);
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f(1.0f,-1.0f,0.0f);
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f(-1.0f,-1.0f,0.0f);
        glColor3f(0.0f,0.0f,1.0f);
        glVertex3f(0.0f,3.0f,0.0f);     //glVertex3f(0.0f,1.0f,0.0f);
    glEnd();
感觉单位量跟NEHE的不一样了啊 帮帮忙啊 谢谢啊
2010-03-26 22:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-300625-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.261594 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved