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一次),但是闪的厉害,体验效果不好,是怎么回事?
展开
 我来答
魔法软糖™
2016-12-26 · TA获得超过837个赞
知道小有建树答主
回答量:822
采纳率:94%
帮助的人:144万
展开全部

使用双缓冲可以解决这个问题,

首先是双缓冲画板的代码

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太卡。


如满意,请采纳,谢谢。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式