对话框中OpenGL的设置

默认分类   2008-04-19 15:16   阅读466   评论3  
字号:    
基于对话框的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中添加

评论(?)
阅读(?)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009