您的位置:首页 > 运维架构

mfc中使用OpenGL的方法

2010-10-10 12:50 204 查看
以前使用win32,但是mfc还是方便些
新建一个类,用来封装opengl相关的信息,一般可直接使用该模式
class COpenGL
{
public:
COpenGL(void);
~COpenGL(void);

HDC hDC;
HGLRC hRC;
Void Init();
bool SetupPixelFormat(HDC);
void Reshape(int width,int height);
void Render(void);
};

COpenGL::COpenGL(void)
{
}

COpenGL::~COpenGL(void)
{
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRC);
}

bool COpenGL::SetupPixelFormat(HDC hDC0)
{
int nPixelFormat; // 象素点格式
hDC=hDC0;
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 // 忽略层,可见性和损毁掩模
};
if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd)))
{ MessageBox(NULL,L"can not find proper mode",L"Error",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
SetPixelFormat(hDC,nPixelFormat,&pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
return TRUE;
}
void COpenGL::Render()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

//在这里画自己的东西
glColor3ub(255,0,0);
glBegin(GL_POLYGON);//填充凸多边形
glVertex3f(0.0f,0.0f ,0.0f);//a点
glVertex3f(1.0f,0.0f, 0.0f);//b点
glVertex3f(1.0f,1.0f,0.0f);//c点
glVertex3f(0.0f,1.0f,0.0f);//d点
glEnd();

glFlush();
SwapBuffers(hDC);
}
void COpenGL::Reshape(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective
( 60.0f,
(GLfloat)width/(GLfloat)height,
0.1f,
100.0f
);
//gluLookAt(10,5,10,0,0,0,0,1,0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
一般需要改变的主要render中的内容。
如果要加入动画控制,可在CopenGL类中包含动画所需参数,在CXXXview中的消息响应中使用
((CXXXApp*)AfxGetApp())->openGL
来控制参数
//////////////////////////////////////////////////////
在XXXapp.h中
#include "OpenGL.h"

public:
COpenGL openGL;

重载OnIdle()
在此函数中渲染,即调用
openGL.Render();
//////////////////////////////////////////////////////
在XXXview.h中初始化并加入自己的控制
在WM_CREATE消息响应中:
((CXXXApp*)AfxGetApp())->openGL.SetupPixelFormat(::GetDC(m_hWnd));
在OnInitialUpdate()中:
((CXXXApp*)AfxGetApp())->openGL.Init();
在WM_SIZE消息响应中:
int height=cy;
int width=cx;
if (height==0){
height=1;
}
((CXXXApp*)AfxGetApp())->openGL.Reshape(width,height);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: