c# 自定义控件刷新时闪烁问题

需要两步:

1. 在构造函数里(其他初始化函数里也行)加入一下代码:

this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);

2. 重绘函数中,使用双缓冲(即先画到Bitmap上,再一次性画到控件上)

            Bitmap bm = new Bitmap(this.Width, this.Height);
            Graphics g = Graphics.FromImage(bm);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, bm.Width, bm.Height);

            //外轮廓
            int outer_w = this.Width / 2 - _mMargins;
            int outer_left = _mMargins + outer_w / 2;
            int outer_right = outer_left + outer_w;
            int outer_top = _mMargins;
            int outer_bottom = (int)(this.Height - _mMargins - (1 + Root3 / 2) * outer_w);

            //底部圆的圆心
            int center_x = this.Width / 2;
            int center_y = this.Height - _mMargins - outer_w;

            //内部液柱
            int inner_w = outer_w - 2 * _mPaddings;
            int inner_left = outer_left + _mPaddings;
            int inner_right = inner_left + inner_w;
            int inner_top = outer_top + _mPaddings;
            int inner_bottom = outer_bottom;
            int inner_radius = this.Width / 2 - _mPaddings - _mMargins;

            //计算现有的比例
            float percent = (_mValue - _mMinimum) / (_mMaximum - _mMinimum);
            int h = (int)((inner_bottom - inner_top) * percent);
            inner_top = inner_bottom - h;

            GraphicsPath outer_path = new GraphicsPath();
            GraphicsPath inner_path = new GraphicsPath();

            outer_path.AddLine(new Point(outer_left, outer_bottom), new Point(outer_left, outer_top));
            outer_path.AddLine(new Point(outer_left, outer_top), new Point(outer_right, outer_top));
            outer_path.AddLine(new Point(outer_right, outer_top), new Point(outer_right, outer_bottom));
            outer_path.AddArc(new Rectangle(center_x - outer_w, center_y - outer_w, 2 * outer_w, 2 * outer_w), -60, 300);

            inner_path.AddLine(new Point(inner_left, inner_bottom), new Point(inner_left, inner_top));
            inner_path.AddLine(new Point(inner_left, inner_top), new Point(inner_right, inner_top));
            inner_path.AddLine(new Point(inner_right, inner_top), new Point(inner_right, inner_bottom));
            inner_path.AddArc(new Rectangle(center_x - inner_radius, center_y - inner_radius, 2 * inner_radius, 2 * inner_radius), -60, 300);

            g.DrawPath(new Pen(_mOuterColor, 2.0F), outer_path);
            g.FillPath(new SolidBrush(_mInnerColor), inner_path);

            g.Dispose();

            e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            e.Graphics.DrawImageUnscaled(bm, new Point(0, 0));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值