当前位置: 首页 > 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;妙手…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...