GDI+学习笔记四-双缓冲图形类

2023-11-18

双缓冲图形:
问题:当在窗体中绘制较为复杂的图形对象时,常会出现闪烁的问题。

.NET Framework解决方案:
提供了双缓冲功能,原理是:当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

默认双缓冲:
在应用程序中使用双缓冲的最简便的方法是使用 .NET Framework 为窗体和控件提供的默认双缓冲。通过将 DoubleBuffered 属性设置为 true 或使用 SetStyle 方法可以为 Windows 窗体和所创作的 Windows 控件启用默认双缓冲。

手动管理缓冲的图形:
对于更多的高级双缓冲情形(如动画或高级内存管理),可以使用 .NET Framework 中的类实现自己的双缓冲逻辑。负责单独分配和管理图形缓冲区的类是 BufferedGraphicsContext 类。 每个应用程序域都有自己的默认 BufferedGraphicsContext 实例来管理此应用程序的所有默认双缓冲。 大多数情况下,每个应用程序只有一个应用程序域,所以每个应用程序通常只有一个默认 BufferedGraphicsContext。 默认 BufferedGraphicsContext 实例由 BufferedGraphicsManager 类管理。 通过调用 BufferedGraphicsManager.Current 属性可以检索对默认 BufferedGraphicsContext 实例的引用。 还可以创建一个专用的 BufferedGraphicsContext 实例以提高图形密集型应用程序的性能。

引用默认的BufferedGraphicsContext实例:
BufferedGraphicsContext myContext;
  myContext = BufferedGraphicsManager.Current;
创建专用的BufferedGraphicsContext 实例:
BufferedGraphicsContext myContext;
  myContext = new BufferedGraphicsContext();
  // Insert code to create graphics here.
  // On a non-default BufferedGraphicsContext instance, you should always 
  // call Dispose when finished.
  myContext.Dispose();

手动呈现缓冲图形:
若要管理自己的缓冲图形,需要能够创建图形缓冲区并呈现其内容。通过调用 Allocate 可以创建与屏幕上的绘图图面关联的 BufferedGraphics 类的实例。 此方法创建一个与特定呈现图面(如窗体或控件)关联的 BufferedGraphics 实例。 创建 BufferedGraphics 实例后,可以将图形绘制到由该实例的 Graphics 属性表示的缓冲区。 执行所有图形操作后,可通过调用 Render 方法将缓冲区的内容复制到屏幕上。

手动显示缓冲的图形步骤:
1. 获得对 BufferedGraphicsContext 类的实例的引用
BufferedGraphicsContext myContext;
  myContext = BufferedGraphicsManager.Current;

2. 通过调用 Allocate 方法来创建 BufferedGraphics 类的一个实例
BufferedGraphics myBuffer;
myBuffer = myContext.Allocate(this.CreateGraphics(),
      this.DisplayRectangle);

3. 通过设置 Graphics 属性将图形绘制到图形缓冲区。
myBuffer.Graphics.DrawEllipse(Pens.Blue, this.DisplayRectangle);

4. 当完成所有图形缓冲区中的绘制操作时,可调用Render法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面
myBuffer.Render(); // or
myBuffer.Render(this.CreateGraphics());

5. 完成呈现图形之后,对 BufferedGraphics 实例调用释放系统资源的 Dispose 方法。 

myBuffer.Dispose();

图形容器:GraphicsContainer 类
表示图形容器的内部数据。当使用 BeginContainer 和 EndContainer 方法保存 Graphics 对象的状态时使用此类。

使用图形容器:
Graphics 对象可被视为容器,因为它包含一组影响绘图的属性并且与设备特定的信息相链接。 通过调用该 Graphics 对象的 BeginContainer 方法可以在现有的 Graphics 对象中创建一个辅助容器。
1. 管理 Graphics 对象的状态:
Graphics 状态:
Graphics 对象不仅仅提供绘制方法,如 DrawLine 和 DrawRectangle。 Graphics 对象还维护图形状态,图形状态可划分为以下几类: 
质量设置,变换,剪辑区域
(1) 质量设置:
Graphics 对象具有几个影响所绘项质量的属性。 例如,可设置 TextRenderingHint 属性以指定应用于文本的抗锯齿的类型(如果有的话)。 影响质量的其他属性是 SmoothingMode、 CompositingMode、 CompositingQuality 和 InterpolationMode。
(2) 变换 
Graphics 对象维护两种应用到由 Graphics 对象绘制的所有项目的变换(世界变换和页变换)。 任何仿射变换都可存储在世界变换中。仿射变换包括缩放、旋转、反射、扭曲和平移。页变换可用于缩放和更改单位(例如,像素到英寸)。
(3) 剪辑区域
Graphics 对象维护应用于由 Graphics 对象绘制的所有项目的剪辑区域。可通过调用SetClip方法设置剪辑区域。

2. 使用嵌套的 Graphics 容器


Matrix 类: 封装表示几何变换的 3 x 3 仿射矩阵。
在 GDI+ 中,您可以在 Matrix 对象中存储仿射变换。 由于表示仿射变换的矩阵的第三列总是(0,0,1),因此在构造 Matrix 对象时,只需指定前两列中的 6 个数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDI+学习笔记四-双缓冲图形类 的相关文章

  • MFC计算机图形学(2)

    这里呢 xff0c 先把上一讲的联系讲一下 一般人都用是一个一个的去画 xff0c 但是那样好麻烦 xff0c 计算机的有点就是容易处理重复的事情 xff0c 那就定义成一个画正方形函数吧 xff0c 每次调用就可以了 怎么自定义函数呢 x
  • MFC计算机图形学(3)

    之前我们已经可以画出直线和曲线了 但是算法虽容易理解 xff0c 但是复杂度高 xff0c 今天就介绍比较流行的DDA画线法 xff0c 还有 xff0c 对鼠标进行事件有所响应 xff0c 即 xff0c 在画板上 xff0c 鼠标左键单
  • 计算机图形学期刊影响因子,计算机图形学 | CCF推荐期刊专刊信息2条

    原标题 xff1a 计算机图形学 CCF推荐期刊专刊信息2条 图形学与多媒体 Computers amp Graphics Call for papers Shape Modelling International SMI 2019 全文截
  • OpenGL入门教程之 纹理

    引言 我们已经了解到 我们可以为每个顶点添加颜色来增加图形的细节 从而创建出有趣的图像 但是 如果想让图形看起来更真实 我们就必须有足够多的顶点 从而指定足够多的颜色 这将会产生很多额外开销 因为每个模型都会需求更多的顶点 每个顶点又需求一
  • 光线追踪(ray tracing)介绍与细节推导

    背景 最近因为找到关于光线追踪相关不错的教程 所以边学习边做记录并希望将相关资料进行分享 光线追踪作为计算机图形学中一种可以获得良好的效果的渲染算法 有着非常广泛的应用 历史背景相关的介绍可参考百度百科或者维基百科 本文中的参考资料来自于P
  • OPENGL学习(四)GLUT三维图像绘制

    文章目录 1 绘制一个旋转的立方体 普通视角变换 2 绘制一个旋转的立方体 透视视角变化 3 画两个旋转方向不同的立方体 对于三维目标来说 最主要的就是有坐标变换问题 也就是说有视角问题 1 绘制一个旋转的立方体 普通视角变换 下面这个程序
  • 实验一 实现改进Bresenham算法

    实验一 实现改进Bresenham算法 一 目的 1 了解直线生成基本原理和常用方法 2 掌握改进Bresenham算法的基本原理和步骤 3 使用C OpenGL编程实现如下内容 输入线段的起始点和终止点坐标位置 利用改进Bresenham
  • 路径追踪原理及实现

    路径追踪 Path Tracing 原理及实现 一 渲染方程 L o p w o
  • 计算机图形学-扫描转换直线段-直线方程法-DDA算法-中点算法-OPENGL实现-详解

    扫描转换直线段 说明与环境配置 环境配置 扫描转换直线段 方法一 直线方程法 代码描述 算法比较简单 暂无代码 方法二 数字差分分析DDA算法 代码描述 方法三 中点算法 代码描述 所有代码下载与效果展示 说明与环境配置 生成一个线段的方法
  • OPENGL学习(一)认识OPENGL和各种库

    认识OPENGL和各种库 opengl 本身是一种标准 告诉你如何一个图形库需要哪些函数 真正这些函数是不同显卡厂商提供的 glu The OpenGL Utility Library OPENGL实用库 就是对OPENGL的更高级的封装
  • C#软件开发实例.私人订制自己的屏幕截图工具(五)针对拖拽时闪烁卡顿现象的优化

    本实例全部文章目录 一 功能概览 二 创建项目 注册热键 显示截图主窗口 三 托盘图标及菜单的实现 四 基本截图功能实现 五 针对拖拽时闪烁卡顿现象的优化 六 添加配置管理功能 七 添加放大镜的功能 八 添加键盘操作截图的功能 九 使用自定
  • 计算机图形学常用算法实现3 多边形扫描转换算法-扫描线算法

    运行环境 vs2015 winform 其他环境只需要替换对应的画点画线算法即可 这个算法其实很复杂的 实现起来需要有耐心 一步一步按照算法思路来写代码 在算法中 我使用的是静态链表 c 没有指针 下面的AET为活性边表 NET存储新边表
  • BRDF

    前言 现实世界中的表面绝大多数都是凹凸不平的 在这种情况下 可以把表面看成是大量朝向各异的微小光学平面的集合 我们肉眼可见的每个点都包含了很多个这样的微小光学平面 光线照射到这些微小表面上时 同样一部分在表面发生反射 这些朝向不同的微表面把
  • 中点分割裁剪算法

    中点分割裁剪算法 python 实验目的 采用中点分割方法找到距离线段顶点最近的可见点 找到后 进行绘制 即可实现直线段在裁剪窗口的裁剪显示 算法思想 设要裁剪的线段是P1P2 中点分割算法可分成两个平行的过程进行 即从P1点出发找出离P1
  • 计算机图形学----光线追踪----路径追踪

    基础知识预备 概率论 概率 期望 概率 值 PDF 概率密度函数 概率密度函数 p x 在数学中 连续型随机变量的概率密度函数 在不至于混淆时可以简称为密度函数 是一个描述这个随机变量的输出值 在某个确定的取值点附近的可能性的函数 也就是结
  • VS2019下的GAMES101作业环境配置

    序 很久很久以前 好像看过这个 GAMES101 现代计算机图形学入门 闫令琪 哔哩哔哩 bilibili 里面好像还有一个实验 当时只是看了看视频里的热闹 并没有写实验 现在想想 还是写一写的好 万一以后用上了呢 虽然是个24K纯小白 估
  • C#软件开发实例.私人订制自己的屏幕截图工具(一)功能概览

    本实例全部文章目录 一 功能概览 二 创建项目 注册热键 显示截图主窗口 三 托盘图标及菜单的实现 四 基本截图功能实现 五 针对拖拽时闪烁卡顿现象的优化 六 添加配置管理功能 七 添加放大镜的功能 八 添加键盘操作截图的功能 九 使用自定
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • GDI+学习笔记7-统计报表的图形绘制

    图形编程 SetPixel 设置指定点的颜色 COLORREF SetPixel HDC hDC int X int Y COLORREF crColor hDC 绘制点的DC X Y 坐标位置 crColor 设置的颜色 返回值为设置颜色
  • 裁剪任意直线段 liang-barshky算法 c

    一 实验目的 使用liang barshky算法实现裁剪任意直线段实验工具 二 实验工具 VC6 0 三 实验步骤 思想 以直线的参数方程为基础 X x1 u x2 x1 Y y1 u y2 y1 裁剪区域是不等式 wxl lt X x1

随机推荐

  • 允许Widget接受拖拽的数据

    实现向widget中拖拽数据并获取数据的方法 1 首先要给widget设置接受拖拽的属性 2 安装事件过滤器 过滤拖拽事件 ui widget gt setAttribute Qt WA AcceptDrops ui widget gt i
  • IDC首份国内电子签约报告:法大大市场份额第一

    日前 IDC 国际数据公司 发布了两份关于中国电子签约市场的报告 中国电子签约软件市场份额报告 2019 和 中国电子签约软件市场预测报告 2020 2024 这是IDC进入中国以来 首度针对国内电子签约市场启动的独立研究 报告显示 从市场
  • 【渗透测试学习】—记录一次自测试渗透实战

    写在前面 本文是作者入门web安全后的第一次完整的授权渗透测试实战 因为最近在总结自己学习与挖掘到的漏 无意中翻到了这篇渗透测试报告 想当初我的这篇渗透测试报告是被评为优秀渗透测试报告的 故在此重新整了一下 分享一下自己的思路与骚操作给大家
  • 卡拉赞服务器延迟,卡拉赞开荒详细功略(前门)

    卡拉赞开荒详细功略 猎手阿图门 无论别人告诉你这个副本有多么简单 对于一个开荒团队来说 这些说法都没有多大意义 简单是胜利者的宣言 但不是功略里该出现的字眼 这份功略尽最大可能提到了每个BOSS的许多细节 希望对你加速开荒进程能够有所帮助
  • hostnamectl 主机名管理

    在linux中修改主机名称是经常使用的 主机名称可以很轻松的识别服务器 centos7系统新增了hostnamectl命令 root hostname hostnamectl h h help 显示帮助 version 显示安装包的版本 t
  • 【论文阅读笔记】Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks

    代码地址 https github com ZhaofanQiu pseudo 3d residual networks 主要贡献 以经济且有效的方式构建了仿3D卷积神经网络模型 P3D ResNet 出发点 3D 卷积神经网络能够同时学习
  • java中nextln的作用_day8[逻辑运算符以及next]

    逻辑运算符 异或 一个数 同一个数两次 会得到原来的数字本身 a b b a a a b a b b a 字符串 字符使用单引号包裹起来的是字符 a 表示多个字符 ABCD 多个字符串 使用双引号包裹 称为字符串 数据类型String S大
  • nmi_watchdog功能测试及解析

    由 b178903294创建 最后修改于9月 23 2019 严格意义来讲nmi watchdog 属于中断检测范畴 是基于非屏蔽中断NMI的检测机制 是一种内核状态监护的狗 关于其介绍可参考nmi watchdog txt 1 2 NMI
  • OpenCV-Python (官方)中文教程(部分一)

    官网链接 英文版 https docs opencv org 4 1 1 d6 d00 tutorial py root html 第一章 OpenCV简介 了解如何在计算机上设置OpenCV Python 1 OpenCV Python教
  • 用在vscode快速FTP发布项目到服务器

    经常遇到前端项目 构建打包时候 需要好一会 构建结算后还用上传 往往这时候需要等待 所以就需要一个构建完项目然后自动上传到服务器目录 1 工具flashfxp 由于flashfxp支持命令行操作 所以我们选择来上传文件 在ftp站点管理里
  • DataGuard强制切换(failover)

    failover切换 执行以下步骤完成Data Guard环境的Failover切换 为了使 failover过程尽量不丢失数据 在执行真正的切换是要尽量处理主数据库到standby数据库redo日志的传输问题 并将它们注册到standby
  • 数据结构——图的深度优先遍历(DFS)

    本文内图的存储方式是邻接矩阵 FS的遍历方法可以类比树的先序遍历 在实现树的先序遍历时 遍历顺序是 根 子树 下一个子树 而DFS的实现方法是优先深度 与一个树按照先序遍历的顺序相同 所以在实现DFS之前 需要先学习 寻找第一个邻接点 Fi
  • 淘宝APP用户体系运营拆解​

    目前 淘宝是目前中国最热门的电商平台 客户在淘宝网的每一步行为都会被系统后台记录下来 对于一个公司来说 如何去分析这些数据 有利于公司去读懂客户 和改善自己的产品体验 从而提高自己的销售量 创造更多的价值 互联网电商相比于传统行业 它的数据
  • TorchX 与 Ax 大整合:更高效的多目标神经架构搜索

    NAS 的目的是发现神经网络的最佳架构 Torch 与 Ax 的整合为多目标探索神经架构的研究提供辅助 本文将展示用 Multi objective Bayesian NAS 运行完全自动的神经架构搜索 Ax 中的多目标优化 Multi O
  • Amdahl定律

    计算机科学中的一个重要定律 描述 系统中某部件由于采用某种方式使系统性能改进后 整个系统系能的提高与该方式的使用频率或占总的执行时间的比例有关 主要应用 改善 系统瓶颈 性能 Amdahl定律定义了加速比 加速比 采用改进措施后性能 未采用
  • Springboot 集成 opencv 实现人脸识别功能

    目录 前言 什么是opencv 项目集成步骤 准备工作 Windows安装opencv Windows环境下集成 关键点1 引入jar包 方式一 idea添加jar 方式二 将jar上传至私服 在maven中引入 关键点2 配置人脸识别特征
  • mysql之控制流程26

    1 控制流程 mysql的控制流程和C Java一样 都不难 看几个例子然后敲几遍就熟了 流程控制结构 顺序 分支 循环 一 分支结构 1 if函数 语法 if 条件 值1 值2 功能 实现双分支 应用在begin end中或外面即可以认为
  • 一起来学nginx(一)

    一起来学nginx 一 nginx概述 nginx是一款web服务器 相当于一个软件 除了nginx还有哪些web服务器 apche openresty nginx的优点 高并发 高性能 可扩展性好 nginx是模块化的 可靠性 热部署 在
  • org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [XXX.xml]';

    tomcat启动时报错 Caused by org springframework core NestedIOException Failed to parse mapping resource file XXX xml nested ex
  • GDI+学习笔记四-双缓冲图形类

    双缓冲图形 问题 当在窗体中绘制较为复杂的图形对象时 常会出现闪烁的问题 NET Framework解决方案 提供了双缓冲功能 原理是 当启用双缓冲时 所有绘制操作首先呈现到内存缓冲区 而不是屏幕上的绘图图面 所有绘制操作完成后 内存缓冲区