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中添加
对话框中OpenGL的设置
最新推荐文章于 2016-12-14 21:30:46 发布