




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC框架下OpenGL程序的实现步骤 2008-01-08 10:39 636人阅读 评论(0) 收藏 举报 本文主要介绍如何在MFC框架下编写OpenGL程序。现有的OpenGL参考书多是介绍基于AUX库,或是基于GLUT库的Win32 OpenGL程序。这类程序结构非常简单,主要目的是让读者熟悉OpenGL语言的用法及功能。然而不得不承认,编写可视化程序MFC框架有其独到的优势,本文就是针对这种需求,详细介绍MFC框架下OpenGL程序的实现步骤。编译器:Microsoft Visual Studio.NET 2003(中文版)准备工作:下载OpenGL非标准额外GLUT库文件/download/download.htm(包括glut.h, glut32.lib, glut32.dll)。将glut.h放到目录VC2003.NET/Vc7/PlatformSDK/Include/gl下,glut32.lib放到目录VC2003.NET/Vc7/PlatformSDK/Lib下,再将glut32.dll放进WINDOWS/system32中,最后设置编译器的链接:【项目】【属性页】【链接器】【输入】【附加依赖项】-glut32.lib。具体实现步骤:1. 新建MFC多文档应用程序,项目名取为Render。2. 新建两个文件WSDView.h和WSDView.cpp,并将这两个文件放入项目文件夹内。具体代码见附录。两文件的功能:创建类CWSDView,它继承自CView,成员函数包括设置像素格式,创建渲染描述表,各类鼠标消息相应函数如鼠标左键拖动,右键拖动及滚轴转动等。3. 【文件】【添加现有项】,选取WSDView.h, WSDView.cpp文件。4. 在RenderView.h文件中添加代码 #include WSDView.h, 将class CRenderView : public CView修改为class CRenderView : public CWSDView在RenderView.cpp文件中修改IMPLEMENT_DYNCREATE(CRenderView, CView)为IMPLEMENT_DYNCREATE(CRenderView, CWSDView);修改 BEGIN_MESSAGE_MAP(CRenderView, CView)为BEGIN_MESSAGE_MAP(CRenderView, CWSDView)5. 在CRenderView类中添加虚拟函数virtual void RenderScene(void)。实际上它是继承自父类CWSDView。6. 在CRenderView:OnDraw(CDC* /*pDC*/)内添加代码: / TODO: 在此处为本机数据添加绘制代码/双缓存应用static BOOL bBusy = FALSE; if(bBusy) return; bBusy = TRUE;/背景色glClearColor(0.0f, 0.0f, 0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/清缓存glMatrixMode(GL_MODELVIEW);/启动模型矩阵glLoadIdentity();/初始化模型矩阵 / 绘制动作glTranslatef(0.0, 0.0, -8.0); /将场景移至可视区RenderScene();/绘制场景glFinish();/完成绘制SwapBuffers(wglGetCurrentDC();/双缓存应用:更新缓存bBusy = FALSE;7. 在CRenderView:RenderScene(void)内添加代码: glPushMatrix();/控制操作如下,与鼠标消息相应函数相关:glTranslatef(m_translateX, m_translateY, 0.0);glRotatef(rotate_x, 1.0, 0.0, 0.0);glRotatef(rotate_y, 0.0, 1.0, 0.0);glScalef(m_scale, m_scale, m_scale);/绘制实体 例如茶壶glPushMatrix();glColor3f(0.5, 0.5, 0.5);glutSolidTeapot(0.3);glPopMatrix(); glPopMatrix();Ok,至此基本框架已经搞定。按照上述步骤,编译运行显示结果:黑色背景下的灰色茶壶。用户使用鼠标达到与场景交互的目的,左键的拖动实现茶壶的旋转,右键拖动可使茶壶平移,滚轴转动则具有放大或缩小的功能。更复杂的OpenGL程序都可基于此框架完成,例如读取几何数据模型文件则可在CRenderDoc类中实现,模型显示代码主要在CRenderView类中的RenderScene()函数中添加,其他功能可根据作者需求适当修改添加,在此不再唠叨。 附录:WSDView.h: #if !defined(AFX_GLVIEW_H_3CA5EA8F_BFF7_43F2_B571_2385D95E5006_INCLUDED_)#define AFX_GLVIEW_H_3CA5EA8F_BFF7_43F2_B571_2385D95E5006_INCLUDED_#if _MSC_VER 1000#pragma once#endif #include gl/glut.h /添加glut库#pragma comment(lib, Opengl32.lib)#pragma comment(lib, glu32.lib)/#pragma comment(lib, glut32.lib)class CWSDView : public CViewprotected: / 仅从序列化创建CWSDView();DECLARE_DYNCREATE(CWSDView)/ 属性public:/ 操作public:/ 重写public:virtual void OnDraw(CDC* pDC); / 重写以绘制该视图virtual BOOL PreCreateWindow(CREATESTRUCT& cs);/ 实现public:virtual CWSDView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:/ 生成的消息映射函数protected:DECLARE_MESSAGE_MAP()public:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnDestroy();/像素格式定义函数bool pixelFormat(void);/ 显示设备环境类变量CClientDC* my_pDC;/ 测试像素格式的函数void testPixelFormat(void);CRect my_oldRect;afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/ 绕X轴旋转角度double rotate_x;double rotate_y;/ 记录光标位置CPoint m_oldPoint;afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg BOOL OnEraseBkgnd(CDC* pDC);/避免屏幕闪烁virtual void RenderScene(void);afx_msg void OnRButtonDown(UINT nFlags, CPoint point);afx_msg void OnRButtonUp(UINT nFlags, CPoint point);afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);/ 沿X方向平移double m_translateX;double m_translateY;/ 缩放系数double m_scale;#endif / !defined(AFX_GLVIEW_H_3CA5EA8F_BFF7_43F2_B571_2385D95E5006_INCLUDED_)WSDView.cpp:/ WSDView.cpp : CWSDView 类的实现/#include stdafx.h#include WSDView.h#include math.h#include ./wsdview.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CWSDView#define PI 3.1415927IMPLEMENT_DYNCREATE(CWSDView, CView)BEGIN_MESSAGE_MAP(CWSDView, CView)/ 标准打印命令ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)ON_WM_CREATE()ON_WM_SIZE()ON_WM_DESTROY()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_WM_ERASEBKGND()ON_WM_RBUTTONDOWN()ON_WM_RBUTTONUP()ON_WM_MOUSEWHEEL()END_MESSAGE_MAP()/ CWSDView 构造/析构CWSDView:CWSDView(): my_pDC(NULL), rotate_x(0), rotate_y(0), m_oldPoint(0), m_translateX(0), m_translateY(0), m_scale(1.0)/ TODO: 在此处添加构造代码CWSDView:CWSDView()BOOL CWSDView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或/ 样式cs.style=WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;return CView:PreCreateWindow(cs);/ CWSDView 诊断#ifdef _DEBUGvoid CWSDView:AssertValid() constCView:AssertValid();void CWSDView:Dump(CDumpContext& dc) constCView:Dump(dc);#endif /_DEBUG/ CWSDView 消息处理程序int CWSDView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: 在此添加您专用的创建代码testPixelFormat();/调用该函数,完成渲染描述表的调用return 0;void CWSDView:OnSize(UINT nType, int cx, int cy)CView:OnSize(nType, cx, cy);/ TODO: 在此处添加消息处理程序代码if(cy 0) my_oldRect.right = cx; my_oldRect.bottom = cy; glMatrixMode(GL_PROJECTION); glLoadIdentity();/视场调节:glFrustum(-1.0, 1.0, -1.0*cy/cx, 1.0*cy/cx, 5.0, 25.0);glViewport(0, 0, cx, cy); RedrawWindow();void CWSDView:OnDestroy()CView:OnDestroy();/ TODO: 在此处添加消息处理程序代码/删除渲染描述表及绑定的设备描述表HGLRChrc;hrc = :wglGetCurrentContext(); :wglMakeCurrent(NULL, NULL); if (hrc) :wglDeleteContext(hrc); if (my_pDC) delete my_pDC;/像素格式定义函数bool CWSDView:pixelFormat(void)/像素属性的设置static PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL|/ support OpenGL PFD_DOUBLEBUFFER, / double buffered PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 ; int pixelformat; if ( (pixelformat = ChoosePixelFormat(my_pDC-GetSafeHdc(), &pfd) = 0 ) MessageBox(ChoosePixelFormat failed); return FALSE; if (SetPixelFormat(my_pDC-GetSafeHdc(), pixelformat, &pfd) = FALSE) MessageBox(SetPixelFormat failed); return FALSE; return TRUE;/ 测试像素格式的函数void CWSDView:testPixelFormat(void)PIXELFORMATDESCRIPTOR pfd; int n;HGLRChrc; my_pDC = new CClientDC(this); ASSERT(my_pDC != NULL); if (!pixelFormat() return; n =:GetPixelFormat(my_pDC-GetSafeHdc(); :DescribePixelFormat(my_pDC-GetSafeHdc(), n, sizeof(pfd), &pfd); hrc = wglCreateContext(my_pDC-GetSafeHdc(); wglMakeCurrent(my_pDC-GetSafeHdc(), hrc);GetClientRect(&my_oldRect); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST);glMatrixMode(GL_MODELVIEW);glLoadIdentity();/ CWSDView 绘制/避免屏幕闪烁BOOL CWSDView:OnEraseBkgnd(CDC* pDC)/ TODO: 在此添加消息处理程序代码和/或调用默认值return true;void CWSDView:RenderScene(void)/控制操作如下:/*glTranslatef(m_translateX, m_translateY, 0.0);glRotatef(rotate_x, 1.0, 0.0, 0.0);glRotatef(rotate_y, 0.0, 1.0, 0.0);glScalef(m_scale, m_scale, m_scale);/光照GLfloatlAmb4;GLfloatlDif4;GLfloatlSpe4;GLfloatlPos4;lAmb0=0.0f;lAmb1=0.0f;lAmb2=0.0f;lAmb3=0.0f;lDif0=1.0f;lDif1=0.0f;lDif2=0.0f;lDif3=0.0f;lSpe0=0.5f;lSpe1=0.0f;lSpe2=0.0f;lSpe3=0.0f;lPos0=1.0f;lPos1=0.0f;lPos2=0.0f;lPos3=0.0f;glLightfv(GL_LIGHT1,GL_AMBIENT,lAmb);glLightfv(GL_LIGHT1,GL_DIFFUSE,lDif);glLightfv(GL_LIGHT1,GL_SPECULAR,lSpe);glLightfv(GL_LIGHT1,GL_POSITION,lPos);glEnable(GL_LIGHTING);glEnable(GL_LIGHT1);/绘制实体glPushMatrix();glColor3f(0.5, 0.5, 0.5);glutSolidTeapot(0.3);glPopMatrix();*/void CWSDView:OnDraw(CDC* /*pDC*/)/*/ TODO: 在此处为本机数据添加绘制代码/双缓存应用static BOOL bBusy = FALSE; if(bBusy) return; bBusy = TRUE;/背景色glClearColor(0.0f, 0.0f, 0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/清缓存glMatrixMode(GL_MODELVIEW);/启动模型矩阵glLoadIdentity();/初始化模型矩阵 / 绘制动作glTranslatef(0.0, 0.0, -8.0);RenderScene();/绘制场景glFinish();/完成绘制SwapBuffers(wglGetCurrentDC();/双缓存应用:更新缓存bBusy = FALSE;*/void CWSDView:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值m_oldPoint = point; Invalidate(true);CView:OnLButtonDown(nFlags, point);void CWSDView:OnLButtonUp(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值Invalidate(true);CView:OnLButtonUp(nFlags,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025物业管理抵押借款合同
- 2025智慧合同管理系统:效率与合规的典范案例
- 2025培训师聘用合同模板
- 2025劳动合同终止协议范本
- 公司财务知识培训主持词课件
- 揭阳空港消防知识培训课件中心
- 技术岗位面试题及答案攻略
- 2025财产委托代管合同范本
- 新媒体人才招募实战模拟面试题集锦
- 全场景面试经验分享:全球百强面试题目的运用与解答
- 找对英语学习方法的第一本书
- 2.AD830机台板面操作讲解
- 《诺丁山》经典台词
- 职高英语词汇表优质资料
- YY/T 0752-2009电动骨组织手术设备
- GB/T 40080-2021钢管无损检测用于确认无缝和焊接钢管(埋弧焊除外)水压密实性的自动电磁检测方法
- GB/T 2-2001紧固件外螺纹零件的末端
- 路基土石方工程施工方案
- 教育评价学全套ppt课件完整版教学教程
- 手术通知单模板
- 油气藏类型、典型的相图特征和识别实例
评论
0/150
提交评论