mfc中使用OpenGL的方法

以前使用win32,但是mfc还是方便些

新建一个类,用来封装opengl相关的信息,一般可直接使用该模式

class COpenGL

{

public:

    COpenGL(void);

    ~COpenGL(void);

   

    HDC hDC;

    HGLRC hRC;

    Void Init();

    bool SetupPixelFormat(HDC);

    void Reshape(int width,int height);

    void Render(void);  

};

 

COpenGL::COpenGL(void)

{

}

 

COpenGL::~COpenGL(void)

{

    wglMakeCurrent(hDC, NULL);

    wglDeleteContext(hRC);

}

 

bool COpenGL::SetupPixelFormat(HDC hDC0)

{

    int nPixelFormat;                 // 象素点格式

    hDC=hDC0;

    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                           // 忽略层,可见性和损毁掩模

    };

    if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd)))

    { MessageBox(NULL,L"can not find proper mode",L"Error",MB_OK|MB_ICONEXCLAMATION);

    return FALSE;

    }

    SetPixelFormat(hDC,nPixelFormat,&pfd);

    hRC = wglCreateContext(hDC);         

    wglMakeCurrent(hDC, hRC);            

    return TRUE;

}

void COpenGL::Render()

{

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);        

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();                        

 

//在这里画自己的东西

    glColor3ub(255,0,0);

    glBegin(GL_POLYGON);//填充凸多边形

    glVertex3f(0.0f,0.0f ,0.0f);//a

    glVertex3f(1.0f,0.0f, 0.0f);//b

    glVertex3f(1.0f,1.0f,0.0f);//c

    glVertex3f(0.0f,1.0f,0.0f);//d

    glEnd();

   

 

    glFlush();

    SwapBuffers(hDC);

}

void COpenGL::Reshape(int width,int height)

{

    glViewport(0,0,width,height);         

    glMatrixMode(GL_PROJECTION);          

    glLoadIdentity();                 

    gluPerspective                        

       ( 60.0f,                       

       (GLfloat)width/(GLfloat)height,

       0.1f,                      

       100.0f                     

       ); 

    //gluLookAt(10,5,10,0,0,0,0,1,0);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

}

一般需要改变的主要render中的内容。

如果要加入动画控制,可在CopenGL类中包含动画所需参数,在CXXXview中的消息响应中使用

    ((CXXXApp*)AfxGetApp())->openGL

    来控制参数

//////////////////////////////////////////////////////

XXXapp.h

#include "OpenGL.h"

 

public:

COpenGL openGL;

 

重载OnIdle()

在此函数中渲染,即调用

openGL.Render();

//////////////////////////////////////////////////////

XXXview.h中初始化并加入自己的控制

WM_CREATE消息响应中:

((CXXXApp*)AfxGetApp())->openGL.SetupPixelFormat(::GetDC(m_hWnd));

OnInitialUpdate():

    ((CXXXApp*)AfxGetApp())->openGL.Init();

WM_SIZE消息响应中:

int height=cy;

    int width=cx;

    if (height==0){

       height=1;

    }

    ((CXXXApp*)AfxGetApp())->openGL.Reshape(width,height);

 

阅读更多

没有更多推荐了,返回首页