MFC+OpenGL_编程入门.pdf
《MFC+OpenGL_编程入门.pdf》由会员分享,可在线阅读,更多相关《MFC+OpenGL_编程入门.pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、科研导航http:/ MFC+OpenGL 编程入门编程入门 OpenGL 作图非常方便,故日益流行,但对许多人来说,是在微机上 进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。下面介绍如何在 VC+上进行 OpenGL 编程。其实相当简单明快,只 因国内缺少这方面的资料与例子,致使许多小细节要一个一个地试,耗去 大量时间。希望各位有什么心得体会,也公布出来,从而节省每个人都要 试试的时间。言归正传,下面以画一条 Bezier 曲线为例,详细介绍 VC+上 OpenGL 编程的方法。这里实际上也给出了个 C+良好封装性编程的范例。文中给 出了详细注释,以便给
2、初学者明确的指引。一步一步地按所述去做,你将顺 利地画出第一个 OpenGL 平台上的图形来。(本文例子以 VC+5.0 为背景)一、产生程序框架 Test.dsw New Project|MFC Application Wizard(EXE)|Test|OK *注*:加“”者指要手工敲入的字串 二、导入 Bezier 曲线类的文件。用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件:科研导航http:/ WorkSpace|ClassView|Test Classes|New Class|Generic Class(不用 MFC 类)|CBezierCurv
3、e|OK 三、编辑好 Bezier 曲线类的定义与实现。写好下面两个文件:BezierCurve.h BezierCurve.cpp 四、设置编译环境:1.在 BezierCurve.h 和 TestView.h 内各加上:#include#include#include 2.在集成环境中,Project|Settings|Link|Object/library module|opengl32.lib glu32.lib glaux.lib|OK 五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp)1.处理 PreCreateWindow():设置 OpenGL
4、 绘图窗口的风格 科研导航http:/ cs.style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CS_OWNDC;2.处理 OnCreate():创建 OpenGL 的绘图设备。OpenGL 绘图的机制 是:先用 OpenGL 的绘图上下文 Rendering Context(简称为 RC)把图画好,再把所绘结果通过 SwapBuffer()函数传给 Window 的 绘图上下文 Device Context(简记为 DC).要注意的是,程序运行 过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图 后,要立即释放 RC,以便其它的 DC 也使用。
5、在后面的代码中,将有 详细注释。int CTestView:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CView:OnCreate(lpCreateStruct)=-1)return-1;Init();return 0;void CTestView:Init()m_pDC=new CClientDC(this);/创建 DC 科研导航http:/ ASSERT(m_pDC!=NULL);if(!bSetupPixelFormat()/设定绘图的位图格式,函数下面列出 return;m_hRC=wglCreateContext(m_pDC-m_hDC);
6、/创建 RC wglMakeCurrent(m_pDC-m_hDC,m_hRC);/RC 与当前 DC 相关联 /CClient*m_pDC;HGLRC m_hRC;是 CTestView 的成员变量 BOOL CTestView:bSetupPixelFormat()static PIXELFORMATDESCRIPTOR pfd=sizeof(PIXELFORMATDESCRIPTOR),/size of this pfd 1,/version number PFD_DRAW_TO_WINDOW|/support window PFD_SUPPORT_OPENGL|/support Ope
7、nGL PFD_DOUBLEBUFFER,/double buffered PFD_TYPE_RGBA,/RGBA type 24,/24-bit color depth 0,0,0,0,0,0,/color bits ignored 科研导航http:/ 0,/no alpha buffer 0,/shift bit ignored 0,/no accumulation buffer 0,0,0,0,/accum bits ignored 32,/32-bit z-buffer 0,/no stencil buffer 0,/no auxiliary buffer PFD_MAIN_PLAN
8、E,/main layer 0,/reserved 0,0,0 /layer masks ignored ;int pixelformat;if(pixelformat=ChoosePixelFormat(m_pDC-m_hDC,&pfd)=0)MessageBox(ChoosePixelFormat failed);return FALSE;if(SetPixelFormat(m_pDC-m_hDC,pixelformat,&pfd)=FALSE)MessageBox(SetPixelFormat failed);科研导航http:/ return FALSE;return TRUE;3.处
9、理 OnDestroy()void CTestView:OnDestroy()wglMakeCurrent(m_pDC-m_hDC,NULL);/释放与 m_hDC 对应的 RC wglDeleteContext(m_hRC);/删除 RC if(m_pDC)delete m_pDC;/删除当前 View 拥有的 DC CView:OnDestroy();4.处理 OnEraseBkgnd()BOOL CTestView:OnEraseBkgnd(CDC*pDC)科研导航http:/ /TODO:Add your message handler code here and/or call de
10、fault /return CView:OnEraseBkgnd(pDC);/把这句话注释掉,若不然,Window /会用白色北景来刷新,导致画面闪烁 return TRUE;/只要空返回即可。5.处理 OnDraw()void CTestView:OnDraw(CDC*pDC)wglMakeCurrent(m_pDC-m_hDC,m_hRC);/使 RC 与当前 DC 相关联 DrawScene();/具体的绘图函数,在 RC 中绘制 SwapBuffers(m_pDC-m_hDC);/把 RC 中所绘传到当前的 DC 上,从而 /在屏幕上显示 wglMakeCurrent(m_pDC-m_
11、hDC,NULL);/释放 RC,以便其它 DC 进行绘图 void CTestView:DrawScene()科研导航http:/ glClearColor(0.0f,0.0f,0.0f,1.0f);/设置背景颜色为黑色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();glTranslated(0.0f,0.0f,-3.0f);/把物体沿(0,0,-1)方向平移 /以便投影时可见。因为缺省的视点在(0,0,0),只有移开 /物体才能可见。/本例是为了演示平面 Bezier 曲线的,只要作一个旋转 /变换,可更清楚
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC OpenGL_ 编程 入门
限制150内