推荐回答
,很高兴为您解答。1:新建一个MFC的工程,单文档的工程。2:工程建好之后,可以先编译运行一下。下面就是要把View的窗口初始化为OpenGL的编程环境。当然以下所有的操作都是在View类中进行的。先在Project->Settings->Link中,加上opengl32.libglu32.libglut.libglaux.lib,然后在View.h的类定义中加上如下引用。include#include#include3:首先要让窗口支持OpenGL,那就必须要对PIXELFORMATDESCRIPTOR这个结构有所了解,先在View类中新建一个函数SetupPixFormatCDC*pDC,类型:看下面的函数就知道为BOOL,写下如下代码:void CTestGLInitialView::OnDestroy{CView::OnDestroy;// TODO: Add your message handler code hereHGLRC hrc = wglGetCurrentContext;wglMakeCurrentNULL, 0;wglDeleteContexthrc;delete m_pDC;}现在可以编译一下了,没有错误。7:现在,OpenGL的环境已经初始化差不多了。可以开始做图了,先定义一个作图的函数DrawScene,写上如下的代码:BOOL CTestGLInitialView::DrawScene{glClearGL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT; // 清除屏幕和深度缓存glLoadIdentity; // 重置当前的模型观察矩阵SwapBuffersm_pDC->GetSafeHdc; // 交换缓冲区return TRUE;}然后,要在OnDraw中,调用这个函数:void CTestGLInitialView::OnDrawCDC* pDC{CTestGLInitialDoc* pDoc = GetDocument;ASSERT_VALIDpDoc;// TODO: add draw code for native data hereDrawScene;}8:运行一下,黑色的背景出来了。9:这时,可以修改DrawScene这个作图函数,作图。画出NeHe第3课的那个三角形和正方形来。写代码如下:BOOL CTestGLInitialView::DrawScene{glClearGL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT; // 清除屏幕和深度缓存glLoadIdentity; // 重置当前的模型观察矩阵glTranslatef-1.5f,0.0f,-6.0f; // 左移 1.5 单位,并移入屏幕 6.0glBeginGL_TRIANGLES; // 绘制三角形glColor3f1.0f, 0.0f, 0.0f;glVertex3f 0.0f, 1.0f, 0.0f; // 上顶点glColor3f0.0f, 1.0f, 0.0f;glVertex3f-1.0f,-1.0f, 0.0f; // 左下glColor3f0.0f, 0.0f, 1.0f;glVertex3f 1.0f,-1.0f, 0.0f; // 右下glEnd; // 三角形绘制结束glTranslatef3.0f,0.0f,0.0f; // 右移3单位glColor3f0.0f, 0.0f, 1.0f;glBeginGL_QUADS; // 绘制正方形glVertex3f-1.0f, 1.0f, 0.0f; // 左上glVertex3f 1.0f, 1.0f, 0.0f; // 右上glVertex3f 1.0f,-1.0f, 0.0f; // 左下glVertex3f-1.0f,-1.0f, 0.0f; // 右下 glEnd;SwapBuffersm_pDC->GetSafeHdc; // 交换缓冲区return TRUE;} 运行一下,发现图形没有出现,这个怎么回事呢。原来是因为还没有定义投影方式和视口。即用正交投影还是透视投影。定义投影,还要捕获WM_SIZE消息。写如下代码:void CTestGLInitialView::OnSizeUINT nType, int cx, int cy{CView::OnSizenType, cx, cy;// TODO: Add your message handler code hereif 0 == cy // 防止被零除{ cy = 1; // 将Height设为1}glViewport0, 0, cx, cy; // 重置当前的视口glMatrixModeGL_PROJECTION; // 选择投影矩阵glLoadIdentity; // 重置投影矩阵// 设置视口的大小gluPerspective45.0f,GLfloatcx/GLfloatcy,0.1f,100.0f;glMatrixModeGL_MODELVIEW; // 选择模型观察矩阵 glLoadIdentity; // 重置模型观察矩阵} 再运行一下,图形已经出来了。以后,就可以在DrawScene写任何画图的代码了,当窗口重绘的时候,都可以自动适应。如果要做一段可以运动的3D图画,可以再捕获WM_TIMER消息,通过在OnCreate的时候定义一个时钟,再配合一些变量,就可以做简单的动画了如若满意,请点击右侧希望我的回答对您有所帮助,!~ O∩_∩O~。
连书纳2019-12-21 18:59:20
提示您:回答为网友贡献,仅供参考。