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);
}
...全文
351 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
张伟强迫症 2016-11-14
  • 打赏
  • 举报
回复
引用 5 楼 qq_36702562 的回复:
你是如何解决的 能告诉我么 我也遇到了相同的问题
就是设置SetTimer 然后让他不断的绘制就可以了
qq_36702562 2016-11-14
  • 打赏
  • 举报
回复
你是如何解决的 能告诉我么 我也遇到了相同的问题
张伟强迫症 2016-11-09
  • 打赏
  • 举报
回复
已经解决啦 多谢各位!
赵4老师 2016-11-04
  • 打赏
  • 举报
回复
搜网络教程“学OpenGL编3D游戏”。
schlafenhamster 2016-11-04
  • 打赏
  • 举报
回复
就是 SetTimer 具体旋转是 glRotated(1, 1.0, 0.0, 0.0);//x
schlafenhamster 2016-11-04
  • 打赏
  • 举报
回复
"DynViews.zip" http://download.csdn.net/detail/schlafenhamster/4206078 "在对话框标签控件中产生OpenGL视图。共有5个不同的gl视图"

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧