MFC中单文档用OPENGL编程,为什么画出的正方形不对,坐标在屏幕上显示的不对

齐文娟 2019-12-21 18:45:00

推荐回答

,很高兴为您解答。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

提示您:回答为网友贡献,仅供参考。

其他回答

  • 由于自然环境中大部分景物具有不规则性、复杂性与随机性,且随着时间变化形状会随之变化,对其进行逼真的实时模拟十分困难,需要大量的计算量和数据量。在虚拟环境中,自然景物的视觉效果直接影响到观察者对周围环境的感知,所以开发一个既能满足逼真度要求,又能实时显示的粒子系统是非常必要的。自从OpenGL公布以来,有关图形学方面的书籍、论文等资料就层出不穷,如何利用OpenGL开发出具有一定水平的计算机图形程序就成为众多学者的追求目标。在VisualC++中,既可利用Win32编程,也可利用MFC编程,两者各有特点,本文就如何利用OpenGL在MFC中开发出一个简单的喷泉模拟程序作一个简单探讨。1OpenGL绘图环境初始化OpenGL是一个跨平台的三维图形库,可在Windows、Unix和Mac等平台上运行。而VisualC++完善的基本类库MFC和应用向导AppWizard使得开发一个复杂的应用程序变得轻松自如。如果将两者结合,便可开发出较高水平的Windows下三维图形应用程序。越来越多的人注意到使用VisualC++和OpenGL开发三维图形动画软件的有利之处,但是有关OpenGL的资料大多都是介绍基本的编程指南或者一些基础的原理或方法,却很少有大型的与应用有关的编程案例,而且有也大多都是基于Win32的类来实现一些简单的图形功能,介绍MFC与OpenGL连接的资料却少之又少,本文主要是在MFC下实现了一个简单的喷泉模拟程序,主要的创新点是分析了MFC下消息响应的内部机制,所以希望本次的探索能对以后利用MFC开发出更高效的程序有所帮助。
    赵颖蕾2019-12-21 19:16:08

相关问答

使用苹果手机打开爱奇艺,同时手机上要打开WIFI,使用WiFi就不需要使用我们的手机流量,这样我们就可以零流量上传和观看视频。IPhone是苹果公司旗下研发的智能手机系列,它搭载苹果公司研发的iOS手机操作系统。第一代iPhone于2019年1月9日公司CEO史蒂夫·乔布斯发布,并在同年6月29日正式发售。2019年9月10日,苹果公司推出第七代产品iPhone5C及iPhone5S,iPhone5S于同年9月20日正式发售。第八代的iPhone6和iPhone6Plus于2019年9月10日正式发布。2019年9月8日,iPhone7和iPhone7Plus正式登台亮相,9月9日开启预约,9月16日正式开卖。2019年9月13日,苹果公司发布三款全新iPhone,4.7英寸的iPhone8、5.5英寸的iPhone8Plus和5.8英寸的iPhoneX。爱奇艺,原名奇艺,于2019年4月22日正式上线,2019年11月26日品牌升级,启动“爱奇艺”品牌并推出全新标志。爱奇艺创始人龚宇博士担任CEO。自成立伊始,爱奇艺坚持“悦享品质”的公司理念,以“用户体验”为生命,通过持续不断的技术投入、产品创新,为用户提供清晰、流畅、界面友好的观映体验。2019年5月7日,收购PPS视频业务,并与爱奇艺进行合并。2019年12月1日,爱奇艺与索尼影业达成战略合作。2019年2月21日,宣布旗下控股子公司爱奇艺已完成一笔15.3亿美元的可转债认购,其中认购3亿美元。此轮可转债的主要认购方为、高瓴资本、博裕资本、润良泰基金、IDG资本、光际资本、红杉资本等。