`
hereson3
  • 浏览: 162916 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

对话框中OpenGL的设置

阅读更多

from:http://huhuiowen.blog.163.com/blog/static/130103920083193167420/
对话框中OpenGL的设置
基于对话框的OpenGL图形程序的基本框架
   1、 理论基础
   a、在对话框中建立需要OpenGL绘图的窗口,并按OpenGL得要求设置窗口的属性和风格;
   b、在该窗口的创建过程中,设置好显示的像素格式,并创建OpenGL绘制描述表RC;
   c、在窗口的绘制过程中,首先获得Windows设备描述表DC,然后将其与事先设置好的OpenGL绘制表述表RC联系起来;
   d、调用OpenGL命令进行图形绘制;
   e、退出OpenGL图形窗口时,释放OpenGL绘制描述表RC和Windows设备描述表DC。
  
   2、变成步骤
   a、设置好OpenGL得编程环境
   b、启动vc6.0,选择NEW菜单,在NEW对话框中选择Project标签,选择"MFC AppWizard(exe)",新建一个基于对话框的工程。名称为MyDlgOpenGL。
   c、删除对话框的静态文本控件。
   d、选择insert->new class菜单,在工程中插入一个新类COpenGL,基类选择generic CWnd。
   e、利用MFC ClassWizard为COpenGL类添加消息WM_CREATE、WM_PAINT得响应函数,WM_CREATE为了设置绘图像素格式,创建渲染描述表。WM_PAINT进行OpenGL渲染。
   f、在OpenGL.h中加入源代码
   public:
   virtual ~COpenGL();
  
   ///////////////////////////////////////////////////////////
   //添加的成员函数与成员变量
   int MySetPixelFormat(HDC hdc);
   void DrawColorBox(void);
   HDC hdc;
   HGLRC hglrc;
   GLfloat step,s;
   ////////////////////////////////////////////////////////////
  
   g、在文件OpenGL.cpp中加入如下代码
  
   COpenGL::COpenGL()
   {
   //给成员变量赋初值
   step = 0.0;
   s = 0.1;
   }
  
   COpenGL::~COpenGL()
   {
   wglMakeCurrent(NULL,NULL);
   wglDeleteContext(hglrc);//删除渲染描述表
   ::ReleaseDC(m_hWnd,hdc);//释放设备描述表
   }
   /////////////////////////////////////////////////////////////////////////////
  // COpenGL message handlers
  //设置像素格式
  int COpenGL::MySetPixelFormat(HDC hdc)
  {
   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 iPixelFormat;
  
   // 为设备描述表得到最匹配的像素格式
   if((iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0)
   {
   MessageBox("ChoosePixelFormat Failed", NULL, MB_OK);
   return 0;
   }
  
   // 设置最匹配的像素格式为当前的像素格式
   if(SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
   {
   MessageBox("SetPixelFormat Failed", NULL, MB_OK);
   return 0;
   }
  
   return 1;
  }
  int COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
   if (CWnd::OnCreate(lpCreateStruct) == -1)
   return -1;
  
   // 设置当前的绘图像素格式
   MySetPixelFormat(::GetDC(m_hWnd));
  
   // 获得绘图描述表
   hdc = ::GetDC(m_hWnd);
   // 创建渲染描述表
   hglrc = wglCreateContext(hdc);
   // 使绘图描述表为当前调用现程的当前绘图描述表
   wglMakeCurrent(hdc, hglrc);
   return 0;
  }
  
  void COpenGL::OnPaint()
  {
  // CPaintDC dc(this); // device context for painting
  
   // TODO: Add your message handler code here
   //调用OpenGL绘图函数进行图形绘制
  // glClearColor(0.0,1.0,0.0,1.0);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
  
   s+=0.005;
   if(s>1.0)
   s=0.1;
   step = step + 1.0;
   if (step > 360.0)
   step = step - 360.0;
   glPushMatrix();
   glScalef(s,s,s);
   glRotatef(step,0.0,1.0,0.0);
   glRotatef(step,0.0,0.0,1.0);
   glRotatef(step,1.0,0.0,0.0);
   DrawColorBox();
   glPopMatrix();
   glFlush();
  
   SwapBuffers(hdc);
  
   // Do not call CWnd::OnPaint() for painting messages
  }
  
  void COpenGL::DrawColorBox(void)
  {
   GLfloat p1[]={0.5,-0.5,-0.5}, p2[]={0.5,0.5,-0.5},
   p3[]={0.5,0.5,0.5}, p4[]={0.5,-0.5,0.5},
   p5[]={-0.5,-0.5,0.5}, p6[]={-0.5,0.5,0.5},
   p7[]={-0.5,0.5,-0.5}, p8[]={-0.5,-0.5,-0.5};
  
   GLfloat m1[]={1.0,0.0,0.0}, m2[]={-1.0,0.0,0.0},
   m3[]={0.0,1.0,0.0}, m4[]={0.0,-1.0,0.0},
   m5[]={0.0,0.0,1.0}, m6[]={0.0,0.0,-1.0};
  
  
   GLfloat c1[]={0.0,0.0,1.0}, c2[]={0.0,1.0,1.0},
   c3[]={1.0,1.0,1.0}, c4[]={1.0,0.0,1.0},
   c5[]={1.0,0.0,0.0}, c6[]={1.0,1.0,0.0},
   c7[]={0.0,1.0,0.0}, c8[]={1.0,1.0,1.0};
  
  
   glBegin (GL_QUADS); //绘制多个四边形
  
   glColor3fv(c1);
   glNormal3fv(m1);
   glVertex3fv(p1);
   glColor3fv(c2);
   glVertex3fv(p2);
   glColor3fv(c3);
   glVertex3fv(p3);
   glColor3fv(c4);
   glVertex3fv(p4);
  
   glColor3fv(c5);
   glNormal3fv(m5);
   glVertex3fv(p5);
   glColor3fv(c6);
   glVertex3fv(p6);
   glColor3fv(c7);
   glVertex3fv(p7);
   glColor3fv(c8);
   glVertex3fv(p8);
  
   glColor3fv(c5);
   glNormal3fv(m3);
   glVertex3fv(p5);
   glColor3fv(c6);
   glVertex3fv(p6);
   glColor3fv(c3);
   glVertex3fv(p3);
   glColor3fv(c4);
   glVertex3fv(p4);
  
   glColor3fv(c1);
   glNormal3fv(m4);
   glVertex3fv(p1);
   glColor3fv(c2);
   glVertex3fv(p2);
   glColor3fv(c7);
   glVertex3fv(p7);
   glColor3fv(c8);
   glVertex3fv(p8);
  
   glColor3fv(c2);
   glNormal3fv(m5);
   glVertex3fv(p2);
   glColor3fv(c3);
   glVertex3fv(p3);
   glColor3fv(c6);
   glVertex3fv(p6);
   glColor3fv(c7);
   glVertex3fv(p7);
  
   glColor3fv(c1);
   glNormal3fv(m6);
   glVertex3fv(p1);
   glColor3fv(c4);
   glVertex3fv(p4);
   glColor3fv(c5);
   glVertex3fv(p5);
   glColor3fv(c8);
   glVertex3fv(p8);
  
   glEnd();
  
  }
  
   h、在文件MyDlgOpenGLDlg.h中加入如下源代码。
  ////////////////////////////////////////////////////
  //添加类COpenGL的头的说明文件
  #include "OpenGL.h"
  //////////////////////////////////////////////////////////////////////////
  
  在class CMyDlgOpenGLDlg : public CDialog中添加

分享到:
评论

相关推荐

    MFC_OpenGL.rar_MFC对话框opengl_opengl 对话框_opengl 类_opengl对话框_全屏

    标签进一步强调了关键概念:“mfc对话框opengl”表明这是关于在MFC对话框中使用OpenGL,“opengl_对话框”表示对话框中内嵌OpenGL画布,“opengl_类”意味着有一个自定义的类用于封装OpenGL操作,“opengl对话框”...

    MyDlgOpenGL.rar_opengl 对话框_opengl对话框_对话框_对话框Opengl

    基于对话框的opengl实例程序,演示如何建立基于对话框的opengl程序

    OpenGL.rar_opengl 对话框_opengl对话框_对话框Opengl

    在Windows环境中,特别是使用Microsoft Visual C++ 6.0(简称VC++6.0)开发图形应用程序时,OpenGL通常与对话框(Dialog Box)结合使用,以创建具有交互性的图形用户界面。 构建OpenGL的对话框涉及以下关键知识点:...

    在MFC对话框中使用OpenGL编程

    在MFC对话框中使用OpenGL编程,涉及到一系列关键步骤,这些步骤确保了OpenGL可以在MFC框架下正确地渲染图形。以下是对这些步骤的详细解析: ### 1. 导入OpenGL库 首先,你需要在项目中引入OpenGL的相关库。这包括`...

    基于MFC对话框的openGL示例程序

    在OpenGL中,可以使用glViewport和glOrtho或gluPerspective函数来控制视口和投影。 自动旋转功能通常通过定时器和OpenGL的旋转矩阵实现。设置一个定时器,每隔一定时间更新旋转角度,然后在OnDraw函数中应用新的...

    基于对话框的OpenGL编程程序框架

    5. 设备上下文(DC)和OpenGL上下文:了解如何在Windows环境中设置和使用OpenGL渲染上下文。 6. 注释的使用:编写清晰的代码注释以提高代码可读性。 7. 用户界面交互:设计用户可以通过对话框与3D环境进行交互的方式...

    基于对话框的OpenGL显示

    在Windows编程环境中,基于对话框(Dialog Box)的OpenGL显示是一种常见的实现图形用户界面(GUI)的方法。对话框是用户与应用程序交互的窗口,而OpenGL则是一个强大的图形库,用于生成2D和3D图像。将这两者结合,...

    MFC对话框下OPENGL程序例子

    首先,为了在MFC对话框中使用OpenGL,我们需要在资源编辑器中添加一个自定义控件,通常是CStatic派生的控件,因为CStatic是MFC中最常用来显示静态文本或图像的控件。然后,我们需要重写这个控件的OnPaint方法,以便...

    基于MFC对话框的OpenGL类

    在“基于MFC对话框的OpenGL类”项目中,我们首先需要了解如何在MFC对话框中嵌入OpenGL支持。这通常涉及到以下几个关键步骤: 1. **创建OpenGL上下文**:在MFC对话框的初始化阶段,我们需要创建一个OpenGL渲染上下文...

    OpenGl基于对话框MFC例程

    在本例中,可能需要GLUT来帮助设置OpenGL环境,比如创建窗口和初始化上下文,但由于是基于对话框的,你可能并不直接使用GLUT的窗口管理功能,而是用MFC的对话框机制。 最后,测试和调试是必不可少的步骤。确保你的...

    MFC基于对话框下的OpenGL

    3. **设置OpenGL上下文**:在对话框的初始化代码中,你需要为OpenGL控件创建一个OpenGL上下文。这通常在`OnInitDialog()`函数中完成。你可以使用`CWnd::GetDC()`获取设备上下文(DC),然后调用`wglCreateContext()`...

    基于对话框的opengl作图

    为了在对话框中嵌入OpenGL,我们需要创建一个自定义的窗口类,该类继承自CWnd,并且重写Create函数,以便为OpenGL提供必要的初始化设置。 在创建OpenGL窗口时,我们需要调用`wglCreateContext`函数来获取OpenGL上...

    vc++ 对话框与对话框的链接以及基于对话框opengl的实现

    你需要在Create函数中设置WS_EX_CLIENTEDGE风格,以便获得一个可用于OpenGL绘图的设备上下文(DC)。 2. 在OnPaint方法中,获取窗口的设备上下文,然后创建一个OpenGL上下文,绑定到这个设备上下文。调用...

    基于对话框的OpenGL程序框架

    在Windows环境中,结合MFC(Microsoft Foundation Classes)库,我们可以创建基于对话框的应用程序来展示OpenGL图形。 在“基于对话框的OpenGL程序框架”中,主要涉及到以下几个关键知识点: 1. **OpenGL上下文...

    OpenGL 基于对话框的程序

    OpenGL是一种强大的图形库,用于在各种操作...通过这个项目,你可以学习到如何在对话框中设置和管理OpenGL上下文,以及如何将OpenGL绘图逻辑与用户交互结合起来。这将有助于提升你在图形界面设计和图形编程方面的技能。

    MFC的对话框中使用OpenGL绘图

    本篇文章将深入探讨如何在MFC对话框中集成OpenGL,实现动态的图形渲染。 首先,要理解MFC对话框的基本结构。MFC是微软提供的C++类库,它简化了Windows API的使用,使得创建和管理窗口和对话框变得更为容易。对话框...

    基于mfc对话框模式的OpenGL的创建

    这个`Opengl_dialog`项目提供了一个起点,让你能够轻松地在MFC对话框中集成OpenGL,从而创建出具有丰富视觉表现力的应用程序。随着对OpenGL和MFC理解的深入,你可以进一步扩展此框架,实现更复杂的图形功能。

    OpenGL.rar_OpenGL MFC_opengl_opengl 对话框_opengl 模型_旋转

    在OpenGL中,模型数据通常以顶点、法线和纹理坐标的形式存在,可能存储在.obj、.3ds或自定义格式的文件中。加载这些文件需要使用文件I/O函数,如fopen、fread等,并解析文件内容,将数据结构化为OpenGL可以理解的...

    OpenGLDlg对话框上显示OpenGL的图形

    3. OpenGL上下文的创建和管理,以及如何在MFC控件中设置和使用它。 4. 熟悉OpenGL的绘图函数,如glBegin(), glEnd(), glVertex3f(), glColor3f(), 和glDrawArrays()等。 5. 双缓冲的概念和SwapBuffers()函数的用途,...

    MFC对话框的OpenGL模板,可以直接操作

    在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架中集成OpenGL,以便在对话框中实现3D图形的交互式操作。MFC是微软提供的一种C++类库,用于构建Windows应用程序,而OpenGL则是一种强大的跨...

Global site tag (gtag.js) - Google Analytics