有的人说,学习要按部就班,学了几年的编程稍有点感悟,个人觉得面对技术的不断变化,以及需求的不断变更,如果按部就班的来搞,人生0.5的时间就浪费了,很多时候问自己,why I do need to learn from the beginner?ask myself why? 群里朋友说,先把MFC学好吧,多练练glut吧,shit,等我学好MFC再从Opengl+MFC了解起,黄花菜都凉了。下面是我查阅了别人的资料,自己加以修改实现的MFC下跑Opengl的程序,总结一下。

It is a good idea to isolate opengl functions from MFC Framework. SO I recommend you to create GLRender class with the fllowing picture showing:

新建MFC时候,选项不同,下图的结构也不同

注解:BOOL GLRender::PrepareScene(HDC hDC)//该函数放在OpenGL2View.cpp----OnCreate事件中,设置像素格式;创建opengl上下文

  void GLRender::DrawScene()//该函数放在OpenGL2View.cpp----OnPaint事件中,Opengl绘画的内容都放于此

  void GLRender::Reshape(int cx, int cy)//该函数放在OpenGL2View.cpp----OnSize事件中,MFC窗体变化时重绘内容。

BOOL GLRender::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
}; this->m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);
if(this->m_GLPixelIndex==0)
{
this->m_GLPixelIndex = 1;
if(DescribePixelFormat(hDC,this->m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
{
return FALSE;
}
} if(SetPixelFormat(hDC,this->m_GLPixelIndex,&pixelDesc)==FALSE)
{
return FALSE;
}
return TRUE;
}

  

BOOL GLRender::CreateGLContext(HDC hDC)
{
this->m_hGLContext = wglCreateContext(hDC);
if(this->m_hGLContext==NULL)
{//创建失败
return FALSE;
} if(wglMakeCurrent(hDC,this->m_hGLContext)==FALSE)
{//选为当前RC失败
return FALSE;
} return TRUE;
}

  

BOOL GLRender::PrepareScene(HDC hDC)
{ if(this->SetWindowPixelFormat(hDC)==FALSE)
{
return 0;
}
if(this->CreateGLContext(hDC)==FALSE)
{
return 0;
}
}

  

void GLRender::Reshape(int cx, int cy)
{
GLsizei width,height;
GLdouble aspect;
width = cx;
height = cy;
if(cy==0)
{
aspect = (GLdouble)width;
}
else
{
aspect = (GLdouble)width/(GLdouble)height;
}
glViewport(-100,0,width+100,height+100);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,500.0*aspect,0.0,500.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
x_width=width;
y_height=height;
}

  

void GLRender::DrawScene()
{
glLoadIdentity();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f) ;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //
// Set up the camera
// glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Determine the screen size so we can determine the aspect ratio
int width, height;
width=x_width;
height=y_height;
GLdouble aspectratio = GLdouble(width) / GLdouble(height); // Set the camera parameters
gluPerspective(25., // Vertical FOV degrees.
aspectratio, // The aspect ratio.
10., // Near clipping 40/130
200.); // Far clipping // Set the camera location
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); gluLookAt(20., 10., 50., // eye x,y,z
0., 0., 0., // center x,y,z
0., 1., 0.); // Up direction //
// Some standard parameters
// // Enable depth test
glEnable(GL_DEPTH_TEST); // Cull backfacing polygons
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE); // Draw a coordinate axis
glColor3d(0., 1., 1.); glBegin(GL_LINES);
glVertex3d(0., 0., 0.);
glVertex3d(12., 0., 0.);
glVertex3d(0., 0., 0.);
glVertex3d(0., 12., 0.);
glVertex3d(0., 0., 0.);
glVertex3d(0., 0., 12.);
glEnd(); //
// INSERT DRAWING CODE HERE
// glFlush();
}

  

DestorySecene函数没有写。简单点就是:准备创建场景;绘制场景;窗口变化时重新绘制场景,虽然简单还是费了不少功夫。通过该框架只需要修改DrawScene的内容,就可以实现不同内容绘制,如果要用glut,把与winds相关的内容删除掉,将glutDisplayFunc那个函数与DrawScene绑定即可,别的文件就不需要修改嘞。如下图

http://download.csdn.net/detail/wuxiaoyan_1988/5828815全部代码这里下载。

vs2010 MFC Opengl实现的更多相关文章

  1. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

  2. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用 ...

  3. VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)

    VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)-软件开发-鸡啄米 http://www.jizhuomi.com/software/143.html   鸡啄米在上一讲中 ...

  4. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  5. VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)

    原文地址: VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)-软件开发-鸡啄米 http://www.jizhuomi.com/software/139.html   上一讲中鸡 ...

  6. VS2010/MFC编程入门教程之目录和总结

    鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够.以此教程的知识为基础,学习VS2010/MFC较为深入的内容 ...

  7. VS2010配置OpenGL开发环境

    OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口.OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任何一个OpenGL应 ...

  8. 《VS2010/MFC编程入门教程》——读书笔记

    推荐两个比较好的学习网站:http://v.dxsbb.com/jisuanji/555/ http://www.jizhuomi.com/software/257.html MFC全称Microso ...

  9. VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

    上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...

随机推荐

  1. poj 1273 Drainage Ditches(最大流)

    http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  2. Python装饰器(decorator)

    了解装饰器,要先了解闭包. 1,闭包(closure) 闭包是Python所支持的一种特性,它让在非global scope定义的函数可以引用其外围空间中的变量,这些外围空间中被引用的变量叫做这个函数 ...

  3. 遇见了这个问题:App.config提示错误“配置系统未能初始化”

    解决办法查找之后居然是这样的,受教了,记录一下 解决: "如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元 ...

  4. ACM之最短路径做题笔记与记录

    在这里纪念一下从4月开始一直因为事情而荒废了的最短路,多亏了jbb的帮助,我才完成了FZU热身赛一题简单的一个用模拟链表存边以及最短路径的学习,目前(6.5)已经学会使用了最简单的djstral与sp ...

  5. shutdown 和closesocket

    来,咱们彻底的来讨论一下这个shutdown   和closesocket 从 函数调用上来分析(msdn):一旦完成了套接字的连接,应当将套接字关闭,并且释放其套接字句柄所占用的所有资源.真正释放一 ...

  6. php连接mysql配置

    php连接mysql测试代码: <?php $link=mysql_connect('localhost','root','123456'); if(!$link) echo "失败! ...

  7. uva 10056 - What is the Probability ?(概率)

    题目连接:uva 10056 - What is the Probability ? 题目大意:给出n和p以及m,表示有n个人在丢色子, 谁先丢到某个值就表示胜利,每个人丢到的胜利数值的概率都为p,问 ...

  8. Joel Spolsky对计算机学生的七大建议

    /*先来介绍下作者:Joel Spolsky,世界最具影响的程序员网志Joel on Software的主人,软件业一位旗帜鲜明的思想者,一位传统软件管理理念的挑战者.他创办的这个网站被程序员誉为“反 ...

  9. This is a sandbox of markdown

    A First Level Header A Second Level Header Now is the time for all good men to come to the aid of th ...

  10. iPhone 微信平台链接到微信文章 返回上一页问题

    东钿金融服务平台 有个隐藏按钮,点击此按钮,会弹出一个九宫格的功能栏,其中有个‘工作时间‘,这项,它是链接到微信公众号里面的一篇文章,按照平常写法就是 直接把文章链接地址 赋在a的href上,但是iP ...