OpenGL图形绘制在MFC中如何不断刷新
张伟强迫症 2016-11-03 09:31:26 在MFC中用OpenGL绘制了一个图形,现在想要做的是如何实现图形的不断绘制,比如实现图形自己的不断旋转或者平移。现在的情况是图形绘制一次就结束了,没有不断的绘制。具体该怎么实现呢?
OpenGL.h
class COpenGL : public CWnd
{
public:
COpenGL(void);
~COpenGL(void);
int MySetPixelFormat( HDC hdc);
void DrawColorBox(void);
public:
HDC hdc;
HGLRC hglrc;
protected:
DECLARE_MESSAGE_MAP()
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
};
//==================================================================
OpenGL.cpp
#include "StdAfx.h"
#include "OpenGL.h"
COpenGL::COpenGL(void)
{
}
COpenGL::~COpenGL(void)
{
wglMakeCurrent( NULL, NULL);
wglDeleteContext(hglrc);
::ReleaseDC(m_hWnd, hdc);
}
BEGIN_MESSAGE_MAP(COpenGL, CWnd)
ON_WM_CREATE()
ON_WM_PAINT()
END_MESSAGE_MAP()
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(_T("ChoosePixelFormat Failed"), NULL, MB_OK);
return 0;
}
// 设置最匹配的像素格式为当前的像素格式
if(SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
{
MessageBox(_T("SetPixelFormat Failed"), NULL, MB_OK);
return 0;
}
return 1;
}
void COpenGL::DrawColorBox()
{
glPushMatrix();
glTranslatef(0.0f, 0.0f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f);
GLUquadric *pObj;
pObj = gluNewQuadric();
gluCylinder(pObj, 5, 5, 5, 100, 10);
glPopMatrix();
}
int COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
hdc = ::GetDC( m_hWnd); // 获得绘图描述表
MySetPixelFormat( hdc); // 创建渲染描述表
hglrc = wglCreateContext( hdc);
wglMakeCurrent( hdc, hglrc);
return 0;
}
void COpenGL::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
//调用OpenGL绘图函数进行图形绘制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
glPushMatrix();
glScalef(0.1, 0.1, 0.1);
//xSpeed += 10;
glRotatef(10, 1.0, 0.0, 0.0);
glRotatef(10, 0.0, 1.0, 0.0);
glRotatef(10, 0.0, 0.0, 1.0);
DrawColorBox();
glPopMatrix();
glFlush();
SwapBuffers(hdc);
}