引子:以前一直惧怕MFC感觉它是一个非常复杂的东西,更不用说去用它来和OpenGL结合了,以前是一直羡慕别人用MFC创建一个窗口进行OpenGL绘图,当初有萌生自己创建一个MFC使用OpenGL的想法,但是由于各种原因一直没成功,最近我又研究了一下,有了一下这些拙见。之前研究一些东西时候,当初明白了,后来再去用就又要重新学习,一直觉得自己差一个做笔记的习惯,或者在电脑上建立一个文档,但是过一段时间就不知道丢哪里去了,所以我要养成写blog的习惯,把自己的拙见都放到这里,不管简单复杂吧,只为能给自己能有一些收获,当然如果机缘巧合有人来到这里看到我的blog并且获得了帮助,那应该是件非常快乐的事^_^
废话说多了,下面进入我第一篇blog的正题。
IDE:VS 2012
工具:OpenGL
//OpenGL
#include
opengl32.lib
glu32.lib
glaux.lib
//file: COpenGL_MFCView.h
class COpenGL_MFCView : public CView
{
//---add members
private:
HGLRC m_hRC;
CClientDC* m_pDC;
......
}
//File: COpenGL_MFCView.cpp
int COpenGL_MFCView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
// 创建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 COpenGL_MFCView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
// 设置视口
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);
}
void COpenGL_MFCView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
// 释放资源
wglMakeCurrent(NULL, NULL);
wglDeleteContext(m_hRC);
delete m_pDC;
}
//File: COpenGL_MFCView.cpp
// 为一个特定的设备环境选择像素格式
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);
}
//File: COpenGL_MFCView.cpp
//绘制坐标轴
void COpenGL_MFCView::drawUnitAxes(void)
{
const GLfloat max = (GLfloat)1.0f;//INT_MAX;
// 实线部分
glBegin(GL_LINES);
// x
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(max, 0.0, 0.0);
// y
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, max, 0.0);
// z
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, max);
glEnd();
// 虚线部分
glEnable(GL_LINE_STIPPLE);
glLineStipple(3, 0xAAAA);
glBegin(GL_LINES);
// x
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(-max, 0.0, 0.0);
// y
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, -max, 0.0);
// z
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, -max);
glEnd();
glDisable(GL_LINE_STIPPLE);
}
//File: COpenGL_MFCView.cpp
// COpenGL_MFCView drawing
void COpenGL_MFCView::OnDraw(CDC* /*pDC*/)
{
COpenGL_MFCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
// 清除颜色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绘制场景
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
{
// 绘制坐标系
drawUnitAxes();
}
glPopMatrix();
// 交换缓冲区
SwapBuffers(wglGetCurrentDC());
}
//File: COpenGL_MFCView.cpp
void COpenGL_MFCView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// 设置背景色
glClearColor(0.0, 0.0, 0.0, 1.0);
// TODO: Add your specialized code here and/or call the base class
}
效果图如下:
第一篇blog完成~~~请多多指教。
本教程工程下载地址:http://download.csdn.net/detail/bbppbb/7235611