OpenGL+MFC编程入门(VS2013)

来源:互联网 发布:淘宝旗舰店加盟 编辑:程序博客网 时间:2024/05/18 15:28

学OpenGL的时候老师总是说MFC的程序,一直觉得不好弄就先没学,这次在实验中出现了,不得不慢慢百度着学习了。感觉刚开始无从下手,所以这这里记录下来过程,也方便看的人少走弯路吧。


一、创建MFC项目。
这里写图片描述
这里写图片描述
照着图片选择完毕后,点击完成。

创建好的结果是这样的:
这里写图片描述

二、导入OpenGL头文件以及lib文件。
首先在stdafx.h中添加OpenGL的头文件:
这里写图片描述

然后导入lib文件:
右键解决方案打开解决方案的属性,然后按图中选择:
这里写图片描述

然后添加lib文件:
这里写图片描述

然后添加bSetDCPixelFormat函数:
这里写图片描述
注意修改的几个地方:
这里写图片描述
然后添加下面的代码:

// 为一个特定的设备环境选择像素格式  bool COpenGL_MFCView::bSetDCPixelFormat(void)  {      // 设置像素格式      static PIXELFORMATDESCRIPTOR pfd =      {          sizeof(PIXELFORMATDESCRIPTOR), // 结构的大小          1, // 结构的版本          PFD_DRAW_TO_WINDOW | // 在窗口(而不是位图)中绘图          PFD_SUPPORT_OPENGL | // 支持在窗口中进行OpenGL调用          PFD_DOUBLEBUFFER, // 双缓冲模式          PFD_TYPE_RGBA, // RGBA颜色模式          32, // 需要32位颜色          0, 0, 0, 0, 0, 0, // 不用于选择模式          0, 0, // 不用于选择模式          0, 0, 0, 0, 0, // 不用于选择模式          16, // 深度缓冲区的大小          0, // 在此不使用          0, // 在此不使用          0, // 在此不使用          0, // 在此不使用          0, 0, 0 // 在此不使用      };      // 选择一种与pfd所描述的最匹配的像素格式      int nPixelFormat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);      if(0 == nPixelFormat) return false;      // 为设备环境设置像素格式      return SetPixelFormat(m_pDC->GetSafeHdc(), nPixelFormat, &pfd);  }

三、添加相应的几个函数(事件函数):OnCreate(窗口创建时调用),Ondestroy(窗口关闭调用),OnInitialUpdate(窗口被创建后运行一次的函数),OnSize(窗口改变时调用)等等一系列函数。
这里写图片描述
这里写图片描述
这里写图片描述
重复上面的过程,添加剩下两个函数。
结果如下:
这里写图片描述

然后添加OnInitialUpdate(类似于OpenGL中的OnInit()函数):
如图打开类向导:
这里写图片描述
这里写图片描述
添加代码:(这里添加的初始化代码根据自己的需要写)

void CMFCTestView::OnInitialUpdate(){    CView::OnInitialUpdate();    // TODO:  在此添加专用代码和/或调用基类    glClearColor(1, 1, 1, 0);    glShadeModel(GL_FLAT);}

添加OpenGL所需要的其他部分代码:
①首先为MFCTestView类添加m_hRC、m_pDC成员变量:
这里写图片描述

private:    HGLRC m_hRC;    CClientDC* m_pDC;

②接着修改相应的事件响应函数,主要涉及三个函数OnCreate(),OnSize(),OnDestroy(),代码如下(照抄就行):

int CMFCTestView::OnCreate(LPCREATESTRUCT lpCreateStruct){    if (CView::OnCreate(lpCreateStruct) == -1)        return -1;    // TODO:  在此添加您专用的创建代码    // 创建DC      m_pDC = new CClientDC(this);    ASSERT(m_pDC != NULL);    // 选择像素格式      if (!bSetDCPixelFormat()) return -1;    // 创建渲染环境, 并使它成为当前渲染环境      m_hRC = wglCreateContext(m_pDC->GetSafeHdc());    wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);    return 0;}
void CMFCTestView::OnDestroy(){    CView::OnDestroy();    // TODO:  在此处添加消息处理程序代码    // 释放资源      wglMakeCurrent(NULL, NULL);    wglDeleteContext(m_hRC);    delete m_pDC;}

这个类似于OpenGL中的ReShape函数:

void CMFCTestView::OnSize(UINT nType, int cx, int cy){    CView::OnSize(nType, cx, cy);    // TODO:  在此处添加消息处理程序代码    //二维图形显示:    glViewport(0, 0, cx, cy);    // 设置投影矩阵(透视投影)      glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluPerspective(60.0, (GLfloat)cx / (GLfloat)cy, 1.0, 1000.0);    // 设置模型视图矩阵      glMatrixMode(GL_MODELVIEW);    glLoadIdentity();    gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);    // 显示三维图形的程序    /*glViewport(0, 0, width, height);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();*/}

添加绘图函数:OnDraw()

void CMFCTestView::OnDraw(CDC* /*pDC*/){    CStudyDoc* pDoc = GetDocument();    ASSERT_VALID(pDoc);    if (!pDoc)        return;    // TODO:  在此处为本机数据添加绘制代码    // 清除颜色      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // 绘制场景      glMatrixMode(GL_MODELVIEW);    glPushMatrix();    DrawPicture(); //为了更加明了,DrawPicture函数就是绘图的核心代码    glPopMatrix();    // 交换缓冲区      SwapBuffers(wglGetCurrentDC());}

四:添加绘图函数myDisplay()
这里写图片描述

代码自己用自己的啦,剩下的步骤都差不多了。

void drawCircle(float x, float y, float r)      //画圆{    int n = 100;    glBegin(GL_POLYGON);    for (int i = 0; i < n; i++)    {        glVertex2f(r*cos(i * 2 * PI / n) + x, r*sin(i * 2 * PI / n) + y);    }    glEnd();}void CMFCTestView::myDisplay(){    glClear(GL_COLOR_BUFFER_BIT);    glColor3f(1, 1, 0);     //外围黄色圆    drawCircle(0, 0, 0.7);    glColor3f(1, 0, 0);     //红色圆    drawCircle(0, 0, 0.65);    glColor3f(1, 1, 0);     //五角星(填充)    glBegin(GL_TRIANGLE_FAN);    glVertex2f(0, 0);    for (int i = 0; i <= 10; i++)    {        if (i & 1)            glVertex2f(0.25*sin(i * 2 * PI / 10), 0.25*cos(i * 2 * PI / 10));        else            glVertex2f(0.65*sin(i * 2 * PI / 10), 0.65*cos(i * 2 * PI / 10));    }    glEnd();    glColor3f(0, 0, 0);     //五角星轮廓    for (int i = 0; i <= 10; i++)    {        float p1_x, p1_y, p2_x, p2_y;        if (i & 1)        {            p1_x = 0.25*sin(i * 2 * PI / 10);            p1_y = 0.25*cos(i * 2 * PI / 10);            p2_x = 0.65*sin((i + 1) * 2 * PI / 10);            p2_y = 0.65*cos((i + 1) * 2 * PI / 10);        }        else        {            p1_x = 0.65*sin(i * 2 * PI / 10);            p1_y = 0.65*cos(i * 2 * PI / 10);            p2_x = 0.25*sin((i + 1) * 2 * PI / 10);            p2_y = 0.25*cos((i + 1) * 2 * PI / 10);        }        glBegin(GL_LINES);        glVertex2f(0, 0); glVertex2f(p1_x, p1_y);        glVertex2f(0, 0); glVertex2f(p2_x, p2_y);        glVertex2f(p1_x, p1_y); glVertex2f(p2_x, p2_y);        glEnd();    }    glFlush();}

五:然后就可以愉快的运行啦:
这里写图片描述

原创粉丝点击