您的位置:首页 > 运维架构

单文档视图结构中利用OpenGL绘制图形

2006-10-31 14:44 417 查看
这次介绍在MFC下单文档视图结构中绘制三维图形的一些步骤.
(1) 创建一个新的工程,新建一个基于单文档(SDI)的工程,名称为SDOpenGL.
(2) 添加OpenGL库.
Project->Settings...->Link标签下,在"Object/library Module"编辑框中加入"opengl32.lib
glu32.lib",(中间为空格),确定.
(3) 添加消息响应函数.WM_CREATE,WM_DESTROY,WM_SIZE的响应函数.
(4) 修改StdAfx.h文件
#include <gl/gl.h>
#include <gl/glaux.h>
#include <gl/glu.h>
(5) 修改SDOpenGLView.h文件
//添加成员函数和成员变量
BOOL RenderSene();//
BOOL SetupPixelFormat();
BOOL InitializeOpenGL(CDC* pDC);

HGLRC m_hRC; //OpenGL绘制描述表
CDC *m_pDC; //OpenGL设备描述表
(6) 修改SDOpenGLView.cpp文件

void CSDOpenGLView::OnDraw(CDC* pDC)
{
CSDOpenGLDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//////////////////////////////////////////////////////////////////
RenderScene(); //渲染场景
//////////////////////////////////////////////////////////////////
}

int CSDOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
//////////////////////////////////////////////////////////////////
//初始化OpenGL
m_pDC = new CClientDC(this);
InitializeOpenGL(m_pDC);
//////////////////////////////////////////////////////////////////

return 0;
}

void CSDOpenGLView::OnDestroy()
{
CView::OnDestroy();

// TODO: Add your message handler code here
/////////////////////////////////////////////////////////////////
//删除调色板和渲染上下文、定时器
::wglMakeCurrent(0,0);
::wglDeleteContext( m_hRC);
if (m_hPalette)
DeleteObject(m_hPalette);
if ( m_pDC )
{
delete m_pDC;
}
/////////////////////////////////////////////////////////////////
}

void CSDOpenGLView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
/////////////////////////////////////////////////////////////////
//添加窗口缩放时的图形变换函数
glViewport(0,0,cx,cy);........
/////////////////////////////////////////////////////////////////

}
//////////////////////////////////////////////////////////
// 初始化openGL场景
//////////////////////////////////////////////////////////
BOOL CSDOpenGLView::InitializeOpenGL(CDC* pDC)
{
m_pDC = pDC;
SetupPixelFormat();
//生成绘制描述表
m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
//置当前绘制描述表
::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

return TRUE;
}

//////////////////////////////////////////////////////////
// 设置像素格式
//////////////////////////////////////////////////////////
BOOL CSDOpenGLView::SetupPixelFormat()
{
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 pixelformat;
pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式
::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式
return TRUE;
}

//////////////////////////////////////////////////////////
// 场景绘制与渲染
//////////////////////////////////////////////////////////
BOOL CSDOpenGLView::RenderScene()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存
glColor3f(0.2f, 0.6f, 1.0f);//绘图颜色
............//绘制函数
::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区!!!
return TRUE;
}

具体参考:http://hi.baidu.com/lion_luoluo/blog/item/3e7dcb3d5c3f79c79e3d6200.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: