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

C#双缓冲绘图

导致画面闪烁的关键原因分析:

一、绘制窗口由于大小位置状态改变进行重绘操作时
绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。
所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。
根据以上分析可知,当图数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。
解决上述问题的关键在于:窗口刷新一次的过程中,让所有图元同时显示到窗口。

二、  进行鼠标跟踪绘制操作或者对图元进行变形操作时
当进行鼠标跟踪绘制操作或者对图元进行变形操作时,Paint事件会频繁发生,这会使窗口的刷新次数大大增加。虽然窗口刷新一次的过程中所有图元同时显示到窗口,但也会有时间延迟,因为此时窗口刷新的时间间隔远小于图元每一次显示到窗口所用的时间。因此闪烁现象并不能完全消除!
所以说,此时导致窗口闪烁现象的关键因素在于Paint事件发生的次数多少。
解决此问题的关键在于:设置窗体或控件的几个关键属性。

双缓冲的关键技术:
1、设置显示图元控件的几个属性,这样可以使效果更加明显。
this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.ResizeRedraw|ControlStyles.AllPaintingInWmPaint,true); 
2、窗口刷新一次的过程中,让所有图元同时显示到窗口。
Bitmap bmp=null;
Graphics g_bmp=null;
bmp=new Bitmap(this.Width,this.Height);
g_bmp=Graphics.FromImage(bmp);
g_bmp.Clear(this.BackColor);
g_bmp.DrawString("重绘",this.Font,new SolidBrush(this.ForeColor),this.Location.X+1,this.Location.Y+1);
this.Refresh();
//在OnPaint方法中实现下面代码
private void this_Paint(object sender,PaintEventArgs e)
{
    Graphics g=e.Graphics;
    if(g==nullreturn;
    if(g_bmp!=null)
    {
        g.DrawImage((Image)bmp,0,0);
    }
}

相关文章:

  • switch命令大全
  • struts2 和 spring整合
  • 什么是md5盐值
  • 自己动手更换近光灯
  • 物理层组件小结
  • 日语学习资料
  • 手动检测网站的SQL注入漏洞
  • 有人黑我们程序员
  • iOS应用程序状态切换相关
  • 十大最佳外国Android游戏下载平台
  • Scala 的学习笔记系列(持续更新中)
  • event.srcElement 和 e.target 用法
  • windows office 界面改进(续)
  • Surface体验WS2012中RDS的RemoteFX虚拟桌面
  • 【转载】Node.js + Express 多个 Layout 文件应用
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • HTML中设置input等文本框为不可操作
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • select2 取值 遍历 设置默认值
  • Spark RDD学习: aggregate函数
  • SpiderData 2019年2月16日 DApp数据排行榜
  • springboot_database项目介绍
  • Sublime text 3 3103 注册码
  • Vue UI框架库开发介绍
  • 构建工具 - 收藏集 - 掘金
  • 关于字符编码你应该知道的事情
  • 后端_MYSQL
  • 两列自适应布局方案整理
  • 前端面试题总结
  • 前言-如何学习区块链
  • 数据科学 第 3 章 11 字符串处理
  • 小李飞刀:SQL题目刷起来!
  • 小试R空间处理新库sf
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 原生Ajax
  • 最简单的无缝轮播
  • MPAndroidChart 教程:Y轴 YAxis
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # Maven错误Error executing Maven
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (09)Hive——CTE 公共表达式
  • (1)(1.13) SiK无线电高级配置(五)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)hibernate配置管理
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)c52学习之旅-中断
  • (三)终结任务
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (译)2019年前端性能优化清单 — 下篇
  • (转)Google的Objective-C编码规范
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .gitignore文件---让git自动忽略指定文件
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记