1.值得记住的约定

一般情况下,VC++下进行OpenGL应用程序开发步骤如下:
1.通过PIXELFORMATDESCRIPTOR结构设置备注描述表DC的像素格式属性。
2.创建渲染描述表RC,并与设备描述表DC建立联系。
3.使用OpenGL作图
4.释放所占用的资源,包括解除DC和RC的联系、删除RC及其关联的DC。
在这里,应该先为应用程序添加所需的变量和函数,对相关变量进行初始化,然后在相应函数中实现DC像素格式设置、RC的创建及其和DC的关联、图形绘制以及资源释放等功能。

2.一个典型实例

2.1 添加成员变量和成员函数

CClientDC* pDrawDC;     // 用于指向当前DC的指针
BOOL PixelformatSetting(void);   // 用于设置像素格式
void GLSetting(void);            // 用于创建渲染描述表RC 并关联RC/DC
void DrawGraphics(void);         //OpenGL作图

2.2 添加消息响应函数

WM_CREATE  --- OnCreate(); //该消息响应函数在建立一个窗体前被调用。
WM_DESTROY --- OnDestroy(); //窗口撤销时响应此函数,因此在该函数中释放所有被占用的资源。
WM_SIZE    --- OnSize();    //改变窗口大小时响应此函数,可以调整视场。
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnSize(UINT nType, int cx, int cy);

2.3 成员函数和消息响应函数添加代码

  • 设置像素格式
BOOL CtestGLView::PixelformatSetting(void)
{static PIXELFORMATDESCRIPTOR pdf ={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,PFD_MAIN_PLANE,0,0,0,0}; //填充PIXELFORMATDISCRIPTORint ipixelformat;//获得最佳匹配的像素格式索引if((ipixelformat = ChoosePixelFormat(pDrawDC->GetSafeHdc(), &pdf))==0){MessageBox(_T("Choose pixel format failed!"));return FALSE;}//把DC的像素格式设置成由索引值ipixelformat指向的像素格式if(SetPixelFormat(pDrawDC->GetSafeHdc(),ipixelformat, &pdf) == FALSE){MessageBox(_T("Set pixel format failed"));return FALSE;}return TRUE;
}
  • 创建渲染描述表,调用PixelFormatSetting()设置像素格式,创建和DC关联的RC
void CtestGLView::GLSetting(void)
{HGLRC hRC;                       //渲染描述表句柄pDrawDC = new CClientDC (this);  //使用pDrawDC指向当前DCASSERT(pDrawDC != NULL);if( !PixelformatSetting())       //设置像素格式return;//创建和当前DC兼容的RC,并和当前DC关联hRC = wglCreateContext(pDrawDC->GetSafeHdc());wglMakeCurrent(pDrawDC->GetSafeHdc(),hRC);
}
  • 在消息响应函数OnCreate()中调用函数GLSetting(),使得GL环境生效
int CtestGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CView::OnCreate(lpCreateStruct) == -1)return -1;GLSetting();return 0;
}
  • 绘制几何拓扑
void CtestGLView::DrawGraphics(void)
{//移动物体到显示区glTranslatef(0.0,0.0,-6.0);  //相当于在调整照相机 避免像太大glRotated(RotateAngle,1,1,1);//以边线的方式绘制三角形glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//绘制三角形,顺序给出3个三角形的顶点glBegin(GL_TRIANGLES);glVertex3f(-0.6,0,0);glVertex3f(0.6,0,0);glVertex3f(0.0,0.15,0.6);glVertex3f(-0.6,0,0);glVertex3f(0,0.15,0.6);glVertex3f(0,0.9,0.6);glVertex3f(0,0.9,0.6);glVertex3f(0,0.15,0.6);glVertex3f(0.6,0,0);glEnd();
}
  • OnDraw函数中,图像显示
void CtestGLView::OnDraw(CDC* /*pDC*/)
{CtestGLDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;static BOOL bBusy = FALSE;  //定义开关变量if(bBusy)                   //开关 绘制完成后才可以更新缓存{return;}bBusy = TRUE;glClearColor(0,0,0.5,0.5);//设置背景颜色glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除深度缓存和颜色缓存glMatrixMode(GL_MODELVIEW);  //启动模型视图矩阵glLoadIdentity();DrawGraphics();SwapBuffers(wglGetCurrentDC());  //更新缓存bBusy = FALSE;
}
  • 删除渲染描述表RC及其绑定的设备描述表DC
void CtestGLView::OnDestroy()
{CView::OnDestroy();//删除渲染描述表及其绑定的设备描述表HGLRC  hRC;  //OpenGL的渲染描述表 hRC = ::wglGetCurrentContext();::wglMakeCurrent(NULL,NULL);  //解除当前RC和DC的关联,并把当前RC非当前化if(hRC){::wglDeleteContext(hRC);}if(pDrawDC){delete pDrawDC;}
}

2.4 添加人机交互(旋转功能)

采用鼠标左键控制开关,定时旋转方案。

WM_BUTTONDOWN  ---  OnLButtonDown();
WM_TIMER       ---  OnTimer();
添加变量:
BOOL bRotate;
float RotateAngle;
void CtestGLView::OnLButtonDown(UINT nFlags, CPoint point)
{if (bRotate){SetTimer(1,100,NULL);} else{KillTimer(1);}bRotate = !bRotate;CView::OnLButtonDown(nFlags, point);
}void CtestGLView::OnTimer(UINT_PTR nIDEvent)
{//定时器计时达到预定时刻 则旋转角度增加10if( nIDEvent == 1){RotateAngle += 10;Invalidate(FALSE);  //重新绘制}CView::OnTimer(nIDEvent);
}

3.输出结果

VC++下的OpenGL编程相关推荐

  1. Win32 OpenGL 编程(1)Win32下的OpenGL编程必须步骤

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Win3 ...

  2. VC++下命名管道编程的原理及实现

    概述 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.命名管道(Named Pipes)是在管道服务器和一台或多台管道客户机之间进行 ...

  3. Qt下的OpenGL 编程(3)绘制平面几何体

    一. 提要 之前的一篇教程已经搭建好了Qt下的OpenGL的编程环境,几天要来学习的就是OpenGL的2D绘图. 2D作为绘图的基础,还是很值得去好好学习,比如迪卡尔坐标,透视设置等等,而所谓的3D, ...

  4. Qt下的OpenGL 编程(1)Qt下的OpenGL编程必须步骤

    一.前言 暑假在家里花了些时间了研究了Ogre,基本是每天一篇wiki教程.最后做完了初级教程后觉得自己进行不下去了,因为里面还有挺多东西都每有理解,所以想来接触一下更"低端"一些 ...

  5. Win32 OpenGL 编程

    Win32 OpenGL 编程(1)Win32下的OpenGL编程必须步骤 一.    前言 人生在于折腾,继续折腾吧. OpenGL 编程的红宝书< OpenGL Programming Gu ...

  6. OpenGL编程入门学习

    OpenGL编程入门学习  非常详细的教程,很适合初学者 本文转自:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html === ...

  7. Win32 OpenGL编程(9) 投影变换

    Win32 OpenGL编程(9) 投影变换 write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 提要 在前文(系列文章(7),以下简 ...

  8. Win32 OpenGL编程系列 2D例子 -- 七巧板图形绘制

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 OpenGL系列文章都已经写到3D部分了,但是感觉2D的例子还是少了点,特意弄个外 ...

  9. QT openGL 编程 笔记

    据说QT牛,特地花了一个晚上来研究研究.其实我也不想把自己搞得熊猫眼,只是碰到问题了精力就特好,想睡觉都不行.第一次尝试在LINUX下用OpenGL编程,实在是很兴奋,只是感觉碰了不少灰.一个问题从1 ...

最新文章

  1. [转]什么是CMMI?
  2. Codeforces 930 A. Peculiar apple-tree (dfs)
  3. SecureCRT 配置文件中 找密码
  4. “出道” 5 年采用率达 78%,Kubernetes 的成功秘诀是什么?
  5. WEB中的java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  6. 花书+吴恩达深度学习(三)反向传播算法 Back Propagation
  7. 关于行内元素的margin padding一些说明;background-color的范围
  8. Apache Maven 入门篇 ( 上 )
  9. 计算机加域成灰色,高手解说win7系统创建域选项变成灰色的具体教程
  10. processing初识
  11. Mybatis的生命周期及作用域
  12. 群体智能优化算法之萤火虫算法(Firefly Algorithm,FA)-看了还不会提刀来找我
  13. java fastfds操作文件
  14. excel检验是否是正态分布-T分布
  15. LeetCode笔记:Biweekly Contest 37 比赛记录
  16. 逻辑运算符以及逻辑表达式
  17. 10款最佳跨浏览器测试工具,建议收藏
  18. 基于STC89C52单片机的蔬菜大棚实时温度测量控制系统
  19. mysql查询本用户的表的列名等信息_mysql常用命令查询手册
  20. 蒙特卡洛粒子滤波定位算法_蒙特卡罗定位算法(基于粒子滤波的定位算法) ——原理、理解与仿真...

热门文章

  1. 代码优化之减少重复代码-实践
  2. Windows2003使用WEB方式修改域用户密码
  3. DM365 dvsdk_2_10_01_18开发环境搭建
  4. hdu 5720(贪心)
  5. NYOJ 118 修路方案(次小生成树)
  6. 70. Climbing Stairs
  7. (2.13)Mysql之SQL基础——触发器
  8. 删除一个目录及其子目录下的所有.svn文件
  9. HDU SPFA算法 Invitation Cards
  10. SQL 取字符串列表