您的位置:首页 > 编程语言

OpenGL+MFC编程入门(VS2013)

2017-10-25 20:25 471 查看
学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();
}


五:然后就可以愉快的运行啦:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl mfc visual studio
相关文章推荐