winforms 如何避免自定义进度条 Flink ?

1u4esq0p  于 2023-10-23  发布在  Flink
关注(0)|答案(1)|浏览(235)

我创建了一个新的用户控件自定义进度条,但是当在form1设计器中使用它时,通过在form1设计器上拖动控件,进度条几乎每秒 Flink 一次。
进度条我做到了,即使在改变控件大小时,百分比内的文本也将始终保持在中心。问题是用的时候闪个不停。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Lightnings_Detector
{
    public partial class CustomProgressBar : UserControl
    {
        public CustomProgressBar()
        {
            InitializeComponent();

            SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);

            this.Height = 23;
        }

        private int _progressValue = 0;
        public int ProgressValue
        {
            get => _progressValue;
            set
            {
                _progressValue = Math.Max(0, Math.Min(100, value));
                Invalidate();
            }
        }

        private string _progressText = "";
        public string ProgressText
        {
            get => _progressText;
            set
            {
                _progressText = value;
                Invalidate();
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, ClientRectangle);
            var rect = new Rectangle(ClientRectangle.X, ClientRectangle.Y, (int)(ClientRectangle.Width * ((double)ProgressValue / 100)), ClientRectangle.Height);
            ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, rect);

            using (var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center })
            {
                e.Graphics.DrawString(ProgressText, Font, Brushes.Black, ClientRectangle, sf);
            }
        }
    }
}
osh3o9ms

osh3o9ms1#

从文档中:
如果将此属性设置为true,则还应将AllPaintingInWmPaint设置为true。微软学习
因此,您应该使用以下代码行:

SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

如果没有 AllPaintingInWmPaint,当我在设计器中调整进度条大小时,进度条会 Flink 。使用 AllPaintingInWmPaint,在调整大小时不再 Flink 。

相关问题