当前位置: 首页 > news >正文

(2)MFC+openGL单文档框架glFrame

2011-07月份写的文章,OpenGL很久不弄了,把它转到博客园,以后如果要用再学习吧!

源码下载:http://download.csdn.net/source/3418661

1.搭载gl环境并设置项目属性

2.在stdafx.h中添加引用

// 包含有关OpenGL函数的头文件
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
#include <gl/glut.h>

3.添加变量

 // OpenGL绘制描述表
 HGLRC m_hRC;
 // OpenGL调色板
 HPALETTE m_hPalette;
 // OpenGL设备描述表
 CDC* m_pDC;

4.添加函数:

private:
 void SetLogicalPalette(void);
 // 初始化openGL场景
 bool InitializeOpenGL(CDC* pDC);
 // 设置像素格式
 bool SetupPixelFormat(void);
 // 场景绘制与渲染
 bool RenderScene(void);

5.添加代码

int CglFrameView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 // TODO:  在此添加您专用的创建代码
//
//初始化OpenGL和设置定时器
 m_pDC = new CClientDC(this);
 SetTimer(1, 2000, NULL);
 InitializeOpenGL(m_pDC);
//
 return 0;
}

BOOL CglFrameView::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: 在此处通过修改
 //  CREATESTRUCT cs 来修改窗口类或样式
    //设置窗口类型
 cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
 return CView::PreCreateWindow(cs);
}

void CglFrameView::OnDraw(CDC* /*pDC*/)
{
 CglFrameDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;
 // TODO: 在此处为本机数据添加绘制代码
 //渲染场景
 RenderScene();
}

void CglFrameView::OnDestroy()
{
 CView::OnDestroy();

 // TODO: 在此处添加消息处理程序代码
 /
//删除调色板和渲染上下文、定时器
 ::wglMakeCurrent(0,0);
 ::wglDeleteContext( m_hRC);
 if (m_hPalette)
     DeleteObject(m_hPalette);
 if ( m_pDC )
 {
  delete m_pDC;
 }
   
/
}

void CglFrameView::OnSize(UINT nType, int cx, int cy)
{
 CView::OnSize(nType, cx, cy);

 // TODO: 在此处添加消息处理程序代码
 //添加窗口缩放时的图形变换函数
 glViewport(0,0,cx,cy);
}

void CglFrameView::SetLogicalPalette(void)
{
  struct
    {
        WORD Version;
        WORD NumberOfEntries;
        PALETTEENTRY aEntries[256];
    } logicalPalette = { 0x300, 256 };

 BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
 BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
 BYTE blues[] = {0, 85, 170, 255};

    for (int colorNum=0; colorNum<256; ++colorNum)
    {
        logicalPalette.aEntries[colorNum].peRed =
            reds[colorNum & 0x07];
        logicalPalette.aEntries[colorNum].peGreen =
            greens[(colorNum >> 0x03) & 0x07];
        logicalPalette.aEntries[colorNum].peBlue =
            blues[(colorNum >> 0x06) & 0x03];
        logicalPalette.aEntries[colorNum].peFlags = 0;
    }

    m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
}

// 初始化openGL场景
bool CglFrameView::InitializeOpenGL(CDC* pDC)
{
 m_pDC = pDC;
 SetupPixelFormat();
 //生成绘制描述表
 m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
 //置当前绘制描述表
 ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

 return TRUE;
}

// 设置像素格式
bool CglFrameView::SetupPixelFormat(void)
{
 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 pixelformat;
 pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式
 ::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式
 if(pfd.dwFlags & PFD_NEED_PALETTE)
  SetLogicalPalette(); //设置逻辑调色板
 return TRUE;
}

// 场景绘制与渲染
bool CglFrameView::RenderScene(void)
{
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.2f, 0.6f, 1.0f);
 ::auxWireSphere(0.5);
 ::auxWireBox (0.1,0.2,0.1);
 ::auxWireCone (0.3,0.4);
 ::SwapBuffers (m_pDC->GetSafeHdc());  //交互缓冲区
 return TRUE;
}

BOOL CglFrameView::OnEraseBkgnd(CDC* pDC)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 //return CView::OnEraseBkgnd(pDC);
 return true;
}

 //OnTImer函数可以不用

void CglFrameView::OnTimer(UINT_PTR nIDEvent)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 //添加定时器响应函数和场景更新函数
    Invalidate(FALSE); 
 CView::OnTimer(nIDEvent);

相关文章:

  • APUE读书笔记-12线程控制-01简介
  • ubuntu解决vim方向键和退格键失效的方法
  • iOS 开发者企业计划 (详细)
  • 【转载】wpf学习笔记2
  • SQL Server 2008 允许远程连接的解决方法
  • PhoneGap:免费开源的 HTML5 移动应用开发平台
  • 卢松松:SEO外链专员操作规范
  • 【c++算法】已序区间算法
  • android 的那些触摸效果
  • Ubuntu下MySql和C连接的一些问题[转]
  • java中把对象、对象bean、list集合、对象数组、Map和Set以及字符串转换成Json
  • 【转载】.Net中通过反射技术的应用----插件程序的开发入门
  • CSS导航设计示例收藏
  • Objective-C 学习资源收集
  • C语言实现#include替换文件
  • Docker下部署自己的LNMP工作环境
  • Fastjson的基本使用方法大全
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JAVA SE 6 GC调优笔记
  • js 实现textarea输入字数提示
  • leetcode98. Validate Binary Search Tree
  • MySQL几个简单SQL的优化
  • Node + FFmpeg 实现Canvas动画导出视频
  • nodejs:开发并发布一个nodejs包
  • node学习系列之简单文件上传
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Spark学习笔记之相关记录
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 多线程事务回滚
  • 工程优化暨babel升级小记
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 入手阿里云新服务器的部署NODE
  • 数组大概知多少
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • # 数据结构
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2020)Java后端开发----(面试题和笔试题)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (备忘)Java Map 遍历
  • (二)linux使用docker容器运行mysql
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (五)网络优化与超参数选择--九五小庞
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)大型网站架构演变和知识体系
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 4.0中的泛型协变和反变
  • .NET Core WebAPI中封装Swagger配置
  • .net FrameWork简介,数组,枚举
  • .NET NPOI导出Excel详解
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表