c# progress绘制文字频繁闪烁问题
主要代码如下:progressBar1.Value=DatatoExcel.dgvCount;Fontft=newFont("TimesNewRoman",(float)...
主要代码如下:
progressBar1.Value = DatatoExcel.dgvCount;
Font ft = new Font("Times New Roman", (float)11, FontStyle.Regular);
PointF pif = new PointF(this.progressBar1.Width / 2 - 12, this.progressBar1.Height / 2 - 7);
this.progressBar1.CreateGraphics().DrawString(proValue, ft, Brushes.Black, pif);
这样是能够实现绘制文本,我把他放到了定时器里面执行(100ms一次),但是闪的厉害,体验效果不好,是怎么回事? 展开
progressBar1.Value = DatatoExcel.dgvCount;
Font ft = new Font("Times New Roman", (float)11, FontStyle.Regular);
PointF pif = new PointF(this.progressBar1.Width / 2 - 12, this.progressBar1.Height / 2 - 7);
this.progressBar1.CreateGraphics().DrawString(proValue, ft, Brushes.Black, pif);
这样是能够实现绘制文本,我把他放到了定时器里面执行(100ms一次),但是闪的厉害,体验效果不好,是怎么回事? 展开
1个回答
展开全部
使用双缓冲可以解决这个问题,
首先是双缓冲画板的代码
using System;
using System.Collections.Generic;
using System.Drawing;
namespace 引擎.绘图.GDI {
/// <summary>
/// 为绘图提供双缓冲[BufferedGraphics]。
/// <para>提供建立多层画纸的方法并返回用于绘制的画纸[Graphics]。</para>
/// </summary>
public class 画板 {
/// <summary>
/// 新建画板并关联到指定区域的画纸上
/// </summary>
/// <param name="关联画纸">关联的Graphic,通常为Form.CreateGraphics</param>
/// <param name="关联矩形">关联的矩形区域,作为画板的工作区</param>
/// <param name="层数">画板内含的缓冲区个数,不建议大于4个,默认为2个</param>
public 画板(Graphics 关联画纸, Rectangle 关联矩形, int 层数 = 2) {
M画纸 = new List<BufferedGraphics>();
M画板 = BufferedGraphicsManager.Current;
显示矩形 = 关联矩形;
画纸数 = 层数;
for (int i = 1; i <= 画纸数; i++) {
BufferedGraphics t画纸;
t画纸 = M画板.Allocate(关联画纸, 显示矩形);
M画纸.Add(t画纸);
}
M当前号 = 0;
}
private BufferedGraphicsContext M画板;
private List<BufferedGraphics> M画纸;
/// <summary>返回缓冲的画纸层数</summary>
public int 画纸数 { get; private set; }
private int M当前号 = 0;
/// <summary>返回Graphics,表示当前预备呈现的画纸</summary>
public Graphics 当前画纸 { get { return M画纸[M当前号].Graphics; } }
/// <summary>返回Graphics,表示指定序号的画纸</summary>
public Graphics 画纸 ( int 号 ) { return M画纸[号].Graphics; }
public Rectangle 显示矩形 { get; set; }
public int 高 { get { return 显示矩形.Height; } }
public int 宽 { get { return 显示矩形.Width; } }
/// <summary>将呈现当前画纸,并使得当前序号递增一位,到尾部时跳回第一张画纸循环</summary>
public void 呈现 ( )
{
M当前号++;
if (M当前号 > 画纸数 - 1) { M当前号 = 0;}
M画纸[M当前号].Render();
}
}
}
然后在窗体顶部定义一个画板
//以下添加到窗体顶部
画板 画板1;
//以下添加到Form_Load
画板1 = new 画板(this.progressBar1.CreateGraphics(),
this.progressBar1.DisplayRectangle)
在计时器Tick处理中,把 this.progressBar1.CreateGraphics() 替换为 画板1.当前画纸
//可能需要清空背景:画板1.当前画纸.Clear(Color.Black);
画板1.当前画纸.DrawString(proValue, ft, Brushes.Black, pif);
画板1.呈现();
PS: 定时器执行间隔改为15~40较好,100太卡。
如满意,请采纳,谢谢。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询