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

mfc 下的OpenGL

建立一个SDI 的MFC工程,然后按freeglut 在mfc 下的编译_leon_zeng0的博客-CSDN博客​​​​​​

一文设置好include lib 路径 

在view 中建立这2个函数:

// Standard OpenGL Init StuffBOOL CmfcOpenglDemoView::SetupPixelFormat()
{static PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR),    // size of this pfd1,                                // version numberPFD_DRAW_TO_WINDOW |              // support windowPFD_SUPPORT_OPENGL |              // support OpenGLPFD_DOUBLEBUFFER,                 // double bufferedPFD_TYPE_RGBA,                    // RGBA type24,                               // 24-bit color depth0, 0, 0, 0, 0, 0,                 // color bits ignored0,                                // no alpha buffer0,                                // shift bit ignored0,                                // no accumulation buffer0, 0, 0, 0,                       // accumulation bits ignored16,                               // 16-bit z-buffer0,                                // no stencil buffer0,                                // no auxiliary bufferPFD_MAIN_PLANE,                   // main layer0,                                // reserved0, 0, 0                           // layer masks ignored};int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);if (m_nPixelFormat == 0)return FALSE;return ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd);
}BOOL CmfcOpenglDemoView::InitOpenGL()
{TRACE(L"InitOpenGL()\n");//Get a DC for the Client Aream_pDC = new CClientDC(this);//Failure to Get DCif (m_pDC == NULL)return FALSE;if (!SetupPixelFormat())return FALSE;//Create Rendering Contextm_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());//Failure to Create Rendering Contextif (m_hRC == 0)return FALSE;//Make the RC Currentif (::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC) == FALSE)return FALSE;// Usual OpenGL stuffglClearColor(0.0f, 0.0f, 0.3f, 0.0f);glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);//glDisable( GL_DEPTH_TEST );//glEnable( GL_TEXTURE_2D );glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//	glDepthMask(GL_FALSE); glLineWidth(1.0f);glPointSize(1.0f);// for testm_RenderScene = render;return TRUE;
}void CmfcOpenglDemoView::RenderScene()
{if (m_RenderScene != NULL)m_RenderScene((CmfcOpenglDemoDoc*)(GetDocument()));elseglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

利用class wizard 建立几个message:

OnCreate(LPCREATESTRUCT lpCreateStruct)

OnDestroy()

OnSize(UINT nType, int cx, int cy)

OnEraseBkgnd(CDC* pDC)

int CmfcOpenglDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO:  Add your specialized creation code hereif (!InitOpenGL()){MessageBox(L"Error setting up OpenGL!", L"Init Error!",MB_OK | MB_ICONERROR);return -1;}COLORREF color = ::GetSysColor(COLOR_3DFACE);glClearColor(0.0, 0, 0.25, 1.0);glPolygonMode(GL_FRONT, GL_FILL);glPolygonMode(GL_BACK, GL_FILL);glEnable(GL_DEPTH_TEST);// AntialiasingglEnable(GL_LINE_SMOOTH);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glLineWidth(1.0);return 0;
}void CmfcOpenglDemoView::OnDestroy()
{CView::OnDestroy();// TODO: Add your message handler code herewglMakeCurrent(0, 0);wglDeleteContext(m_hRC);if (m_pDC){delete m_pDC;}m_pDC = NULL;
}void CmfcOpenglDemoView::OnSize(UINT nType, int cx, int cy)
{CView::OnSize(nType, cx, cy);// TODO: Add your message handler code hereResize(cx,cy);RenderScene();//	OnPaint();
}BOOL CmfcOpenglDemoView::OnEraseBkgnd(CDC* pDC)
{// TODO: Add your message handler code here and/or call defaultTRACE("COpem:OnEraseBkgnd--\n");return CView::OnEraseBkgnd(pDC);
}void CmfcOpenglDemoView::Resize(int cx,int cy)
{// TODO: Add your implementation code here.GLsizei width, height;GLdouble aspect;width = cx;height = cy;if (cy == 0)aspect = (GLdouble)width;elseaspect = (GLdouble)width / (GLdouble)height;glViewport(0, 0, width, height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1.0f,1.0,-1.0f,1.0f);//glOrtho(-4.0 * aspect - pDoc->m_transX, 4.0 * aspect - pDoc->m_transX, -4 - pDoc->m_transY, 4 - pDoc->m_transY, -10, 10);//aspect=cx/cyglMatrixMode(GL_MODELVIEW);//glMatrixMode( GL_PROJECTION );}

Resize 可以参考下面代码,设置立体图,上面代码只是正面的平面图。

	width = m_sizeCx;height = m_sizeCy;if(m_sizeCy==0)aspect = (GLdouble)width;elseaspect = (GLdouble)width/(GLdouble)height;glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(pDoc->m_ViewSelect==0)gluPerspective(45,aspect,1,100.0);else//gluOrtho2D(0.0f,aspect,0.0f,1.0f);glOrtho(-4.0*aspect-pDoc->m_transX, 4.0*aspect-pDoc->m_transX, -4-pDoc->m_transY,4-pDoc->m_transY, -10, 10);//aspect=cx/cyglMatrixMode(GL_MODELVIEW);

glOtho2D 参看

https://registry.khronos.org/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml

C Specification

void glOrtho(GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);

Parameters

leftright

Specify the coordinates for the left and right vertical clipping planes.

bottomtop

Specify the coordinates for the bottom and top horizontal clipping planes.

nearValfarVal

Specify the distances to the nearer and farther depth clipping planes. These values are negative if the plane is to be behind the viewer.

Description

glOrtho describes a transformation that produces a parallel projection. The current matrix (see glMatrixMode) is multiplied by this matrix and the result replaces the current matrix, as if glMultMatrix were called with the following matrix as its argument:

2right-left00��02top-bottom0��00-2farVal-nearVal��0001

where

��=-right+leftright-left

��=-top+bottomtop-bottom

��=-farVal+nearValfarVal-nearVal

Typically, the matrix mode is GL_PROJECTION, and leftbottom-nearVal and righttop-nearVal specify the points on the near clipping plane that are mapped to the lower left and upper right corners of the window, respectively, assuming that the eye is located at (0, 0, 0). -farVal specifies the location of the far clipping plane. Both nearVal and farVal can be either positive or negative.

Use glPushMatrix and glPopMatrix to save and restore the current matrix stack.

Errors

GL_INVALID_VALUE is generated if left = right, or bottom = top, or near = far.

GL_INVALID_OPERATION is generated if glOrtho is executed between the execution of glBegin and the corresponding execution of glEnd.

 

在.h 文件中加这几个函数 

	void SetRenderFunc(void (*func) (CmfcOpenglDemoDoc*)) { m_RenderScene = func; }void RenderScene();// Each viewport uses its own context// so we need to make sure the correct// context is set whenever we make an// OpenGL command.void SetContext() { wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC); }void SwapGLBuffers() { SwapBuffers(m_pDC->GetSafeHdc()); }

添加一个画图函数,不是类里的,独立的

void render(CmfcOpenglDemoDoc* pdoc)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glBegin(GL_TRIANGLE_STRIP);glColor3f(0.0f, 0.5f, 0.0f);glVertex2f(0.0f, -0.0f);glVertex2f(0.0f, 0.3f);glVertex2f(0.4f, 0.0f);glEnd();}

 在init里有这一句:

m_RenderScene = render;

在.h 文件中有:

// Attributes
public:CmfcOpenglDemoDoc* GetDocument() const;//------------------void (*m_RenderScene) (CmfcOpenglDemoDoc* doc);	// void function pointer to the rendering// function. Used to change to easily// change what a viewport displays.
protected:HGLRC m_hRC; //Rendering ContextCDC* m_pDC;  //Device Context// Operations
public:// OpenGL init stuffBOOL SetupPixelFormat();BOOL InitOpenGL();

 这样就构造了一个基本的mfc 下的opengl 工程

相关文章:

mfc 下的OpenGL

建立一个SDI 的MFC工程,然后按freeglut 在mfc 下的编译_leon_zeng0的博客-CSDN博客​​​​​​ 一文设置好include lib 路径 在view 中建立这2个函数: // Standard OpenGL Init StuffBOOL CmfcOpenglDemoView::SetupPixelFormat() {static PIXELFOR…...

机器翻译目前广泛应用于文档翻译以及硬件翻译

机器翻译(Machine Translation,MT)是一种自动化技术,用于将一种语言的文本转换为另一种语言的文本。它通常被用于跨语言交流和全球化的需求。 机器翻译目前可分为软件和硬件,软件常用的则是文档翻译、文字翻译、图片翻…...

木材加工工厂数字孪生可视化管理平台,赋能传统木材制造业数字化高质转型

数字化是当今经济发展的主流话题,以赋能传统制造业转型升级的需求最为迫切、效果最为显著。目前世界各国正积极发力智能制造,力求争夺智能制造领先位置,而构建适应传统制造业转型的数字化平台成为当务之急。数字化、智能化已成为木材加工行业…...

企业级低代码开发,科技赋能让企业具备“驾驭软件的能力”

科技作为第一生产力,其强大的影响力在各个领域中都有所体现。数字技术,作为科技领域中的一股重要力量,正在对传统的商业模式进行深度的变革,为各行业注入新的生命力。随着数字技术的不断发展和应用,企业数字化转型的趋…...

在WSL2中安装多个Ubuntu实例

参考:How to install multiple instances of Ubuntu in WSL2 本文主要内容 第一步:在 WSL2 中安装最新的 Ubuntu第二步:下载适用于 WSL2 的 Ubuntu 压缩包第三步:在 WSL2 中安装第二个 Ubuntu 实例第四步:登录到第二个…...

java--实体javaBean

1.什么是实体类 1.就是一种特殊形式的类 2.这个类中的成员变量都要私有,并且要对外提供相应的getXXX,setXXX方法 3.类中必须要有一个公共的无参的构造器 2.实体类有啥应用场景 实体类只负责数据存取,而对数据的处理交给其他类来完成&…...

重温设计模式之什么是设计模式?

设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相关的对象,以适当的粒度将它们归类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的…...

CSS关于默认宽度

所谓的默认宽度&#xff0c;就是不设置width属性时&#xff0c;元素所呈现出来的宽度 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}.box {/…...

JDBC(二)

第4章 操作BLOB类型字段 4.1 MySQL BLOB类型 MySQL中&#xff0c;BLOB是一个二进制大型对象&#xff0c;是一个可以存储大量数据的容器&#xff0c;它能容纳不同大小的数据。 插入BLOB类型的数据必须使用PreparedStatement&#xff0c;因为BLOB类型的数据无法使用字符串拼接写…...

LeetCode----149. 直线上最多的点数

 题目 给你一个数组 points &#xff0c;其中 points[i] [ x i x_i xi​, y i y_i yi​] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3 示例 2&#xff1a; 输入…...

19、Flink 的Table API 和 SQL 中的自定义函数及示例(3)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

Flutter IOS 前后台切换主题自动变化的问题

BUG 触发条件 设备 IOS 15 模拟器GetX 实现换肤GetMaterialApp 里面配置好 theme和darkTheme使用GetView和GetController进行开发 此时如果把App前后台切换&#xff0c;使用Obx包括起来的内容会跟谁异常主题变换&#xff0c;未使用Obx的颜色不会变化。 解决路径 首先在获取 …...

rabbitmq入门学习

写在前面 本文看下rabbit mq的基础概念以及使用。 1&#xff1a;简单介绍 为了不同进程间通信的解耦&#xff0c;出现了消息队列&#xff0c;为了规范消息队列的具体实现&#xff0c;Java制定了jms规范&#xff0c;这是一套基于接口的规范&#xff0c;因此是绑定语言的&…...

说说对Fiber架构的理解?解决了什么问题?

一、问题 JavaScript引擎和页面渲染引擎两个线程是互斥的&#xff0c;当其中一个线程执行时&#xff0c;另一个线程只能挂起等待 如果 JavaScript 线程长时间地占用了主线程&#xff0c;那么渲染层面的更新就不得不长时间地等待&#xff0c;界面长时间不更新&#xff0c;会导…...

Spring Security笔记

Spring Security 是 Spring家族中的一个安全管理框架。 一般来说中大型的项目都是使用 SpringSecurity 来做安全框架&#xff0c;小项目用相对简单的Shiro。认证、授权是 SpringSecurity 作为安全框架的核心功能。 认证&#xff1a;通过用户名密码验证当前访问系统的是不是本…...

快速教程|如何在 AWS EC2上使用 Walrus 部署 GitLab

Walrus 是一款基于平台工程理念的开源应用管理平台&#xff0c;致力于解决应用交付领域的深切痛点。借助 Walrus 将云原生的能力和最佳实践扩展到非容器化环境&#xff0c;并支持任意应用形态统一编排部署&#xff0c;降低使用基础设施的复杂度&#xff0c;为研发和运维团队提供…...

[vmware]vmware虚拟机压缩空间清理空间

vmware中的ubuntu使用如果拷贝文件进去在删除&#xff0c;vmare镜像文件并不会减少日积月累会不断是的真实物理磁盘空间大幅度减少&#xff0c;比如我以前windows操作系统本来只有30GB最后居然占道硬盘200GB&#xff0c;清理方法有2种。 第一种&#xff1a;vmware界面操作 第二…...

一篇文章带你使用(MMKV--基于 mmap 的高性能通用 key-value 组件)

一、MMKV是什么&#xff1f; MMKV 是基于 mmap 内存映射的 key-value 组件&#xff0c;底层序列化/反序列化使用 protobuf 实现&#xff0c;性能高&#xff0c;稳定性强。也是腾讯微信团队使用的技术。 支持的数据类型 支持以下 Java 语言基础类型&#xff1a; boolean、int…...

Pytorch 里面torch.no_grad 和model.eval(), model.train() 的作用

torch.no_grad: 影响模型的自微分器&#xff0c;使得其停止工作&#xff1b;这样的话&#xff0c;数据计算的数据就会变快&#xff0c;内存占用也会变小&#xff0c;因为没有了反向梯度计算&#xff0c;当然&#xff0c;我哦们也无法做反向传播。 model.eval() 和model.train()…...

Ozon产品内容评级功能上线,妙手ERP实力助力Ozon卖家全方位打造爆款产品!

产品内容评级&#xff0c;可以直接反映产品质量的高低&#xff0c;也是影响产品排名的关键。具有较高内容评级的产品&#xff0c;将有更大机会显示在搜索结果和类目的前几页中&#xff0c;从而引起买家的关注&#xff0c;促进销售。 为帮助卖家打造高质量产品&#xff0c;妙手…...

Fan Control风扇控制软件终极指南:从零开始掌握Windows风扇调速技巧 [特殊字符]

Fan Control风扇控制软件终极指南&#xff1a;从零开始掌握Windows风扇调速技巧 &#x1f680; 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://git…...

WMS仓储管理系统操作培训

导语大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家使用我们的仓储物流技术AI智能体。专业书籍&#xff1a;《智能物流系统构成与技术实践》|《智能仓储项目英语手册》|《智能仓储项目必坑手册》|《智能仓储项目甲方必读》|《12大…...

用Python实战遗传模拟退火算法:手把手教你搞定旅行商问题(附完整代码)

用Python实战遗传模拟退火算法&#xff1a;手把手教你搞定旅行商问题&#xff08;附完整代码&#xff09; 当你在规划物流配送路线或是设计电路板布线时&#xff0c;总会遇到一个经典难题&#xff1a;如何在多个节点间找到最短路径&#xff1f;这就是著名的旅行商问题&#xf…...

手把手教你用PaddleOCR的SVTR模型:从环境搭建到中文场景文字识别实战

手把手教你用PaddleOCR的SVTR模型&#xff1a;从环境搭建到中文场景文字识别实战 在数字化浪潮席卷各行各业的今天&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术已成为连接物理世界与数字世界的桥梁。无论是金融行业的票据处理、零售行业的商品标签识别&#xff0c…...

AI写专著实战指南:借助AI工具,一周完成20万字专著撰写!

写学术专著不仅是一项对学术能力的考验&#xff0c;更是对心理素质的一次挑战。与可以依赖团队分担的论文写作不同&#xff0c;专著的创作通常是个人独自进行的。研究者从确定选题到建立框架&#xff0c;再到具体内容的编写和修改&#xff0c;几乎每个环节都需要自己来完成。这…...

深入理解Linux FrameBuffer:从`fb_var_screeninfo`的字段看屏幕时序与色彩格式

深入理解Linux FrameBuffer&#xff1a;从fb_var_screeninfo的字段看屏幕时序与色彩格式 当你在嵌入式设备上调试显示异常时&#xff0c;是否遇到过这样的场景&#xff1a;屏幕闪烁不定&#xff0c;分辨率显示不正确&#xff0c;或是色彩出现严重偏差&#xff1f;这些问题的根源…...

别再死记硬背了!用Python的NumPy和Matplotlib亲手画一遍反双曲函数图像,理解立马翻倍

用Python可视化反双曲函数&#xff1a;从数学公式到动态图像的探索之旅 数学公式总是让人望而生畏&#xff0c;尤其是那些带着"反"字头的函数——反三角函数、反双曲函数&#xff0c;光是名字就足以让大多数人头疼。但如果你见过它们的图像&#xff0c;一切就会变得直…...

Ignition 中间件深度剖析:错误信息收集与展示的完整流程

Ignition 中间件深度剖析&#xff1a;错误信息收集与展示的完整流程 【免费下载链接】ignition A beautiful error page for Laravel apps 项目地址: https://gitcode.com/gh_mirrors/ig/ignition Ignition 作为 Laravel 应用的优雅错误页面解决方案&#xff0c;其核心功…...

【Linux 网络】理解并应用应用层协议

HTTP的请求与响应格式 请求格式 请求行&#xff1a;请求方法(GET) 空格 URI(资源地址) 空格 HTTP版本(HTTP/1.1) 换行符(\r\n) 请求报头&#xff1a;表示请求的属性。冒号分割的键值对&#xff1b;每组属性之间使用 \r\n 分隔&#xff0c;遇到空行表示Header部分结束。 请求…...

从Arduino到STM32:用AS5600磁编码器做个角度传感器,附完整代码与精度对比

从Arduino到STM32&#xff1a;AS5600磁编码器实战指南与精度优化 磁编码器在现代运动控制系统中扮演着关键角色&#xff0c;而AS5600作为一款高性价比的解决方案&#xff0c;正受到越来越多创客和工程师的青睐。本文将带您跨越Arduino快速原型开发与STM32工业级应用之间的鸿沟&…...