双缓存及曲线绘制

双缓存及曲线绘制

ID:40796823

大小:250.39 KB

页数:17页

时间:2019-08-07

双缓存及曲线绘制_第1页
双缓存及曲线绘制_第2页
双缓存及曲线绘制_第3页
双缓存及曲线绘制_第4页
双缓存及曲线绘制_第5页
资源描述:

《双缓存及曲线绘制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、导致画面闪烁的关键原因分析:     一、绘制窗口由于大小位置状态改变进行重绘操作时    绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。    所以说,此时导致窗口闪烁

2、现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。    根据以上分析可知,当图元数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。    解决上述问题的关键在于:窗口刷新一次的过程中,让所有图元同时显示到窗口。     二、进行鼠标跟踪绘制操作或者对图元进行变形操

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

4、is.SetStyle(ControlStyles.OptimizedDoubleBuffer

5、                     ControlStyles.ResizeRedraw

6、                   ControlStyles.AllPaintingInWmPaint,true);2、窗口刷新一次的过程中,让所有图元同时显示到窗口。   可以通过以下几种方式实现,这几种方式都涉及到Graphics对象的创建方式。具体实现1、 利用默认双缓冲 (1)在应用程序中使用双缓冲的最简便的方法

7、是使用.NETFramework为窗体和控件提供的默认双缓冲。通过将DoubleBuffered属性设置为true。      this.DoubleBuffered=true; (2)使用SetStyle方法可以为Windows窗体和所创作的Windows控件启用默认双缓冲。 SetStyle(ControlStyles.OptimizedDoubleBuffer,true); 2、 手工设置双缓冲 .netframework提供了一个类BufferedGraphicsContext负责单独分配和管理图形缓冲区

8、。每个应用程序域都有自己的默认BufferedGraphicsContext实例来管理此应用程序的所有默认双缓冲。大多数情况下,每个应用程序只有一个应用程序域,所以每个应用程序通常只有一个默认BufferedGraphicsContext。默认BufferedGraphicsContext实例由BufferedGraphicsManager类管理。通过管理BufferedGraphicsContext实现双缓冲的步骤如下:(1)获得对BufferedGraphicsContext类的实例的引用。(2)通过调用Bu

9、fferedGraphicsContext.Allocate方法创建BufferedGraphics类的实例。(3)通过设置BufferedGraphics.Graphics属性将图形绘制到图形缓冲区。(4)当完成所有图形缓冲区中的绘制操作时,可调用BufferedGraphics.Render方法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面。(5)完成呈现图形之后,对BufferedGraphics实例调用释放系统资源的Dispose方法。完整的例子,在一个400*400的矩形框内绘制1000

10、0个随机生成的小圆。          BufferedGraphicsContextcurrent=BufferedGraphicsManager.Current;//(1)          BufferedGraphicsbg;          bg=current.Allocate(this.CreateGraphics(),this.DisplayRectan

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。