Отключить анимацию WinForms ProgressBar

есть ли возможность отключить анимацию индикатора выполнения?

Мне это нужно для какой-то pocess, которая приостановлена и не работает в данный момент. Средний пользователь будет думать, что процесс выполняется, если индикатор будет мигать.

совет по созданию собственного контроля хода выполнения - это не то, что я ищу.

6 ответов


вы можете использовать приостановленное состояние индикатора выполнения Vista,такой:

// Assuming a Form1 with 3 ProgressBar controls
private void Form1_Load(object sender, EventArgs e)
{
  SendMessage(progressBar2.Handle,
    0x400 + 16, //WM_USER + PBM_SETSTATE
    0x0003, //PBST_PAUSED
    0);

  SendMessage(progressBar3.Handle,
    0x400 + 16, //WM_USER + PBM_SETSTATE
    0x0002, //PBST_ERROR
    0);
}

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern uint SendMessage(IntPtr hWnd,
  uint Msg,
  uint wParam,
  uint lParam);

стандартное средство связи с пользователем, что действие либо приостановлено, либо не может быть точно измерено, заключается в использовании стиля отображения шатра.

progressBar1.Style = ProgressBarStyle.Marquee;

этот стиль игнорирует Maximum и Value свойства и отображает индикатор выполнения "сегмент", который постоянно перемещается по индикатору выполнения и петляет вокруг (он не заполняет индикатор выполнения, он перемещает то, что выглядит как раздел бара полностью через элемент управления и вокруг к началу снова.)


моим обходным путем было использование элемента управления панели вместо ProgressBar. Я изменил BackColor, BorderStyle (на Fixed3D), и я манипулирую его шириной, чтобы отобразить необходимый уровень прогресса. Я предположил, что 100% прогресса равно ширине формы.

Panel as a ProgressBar


то, что вы хотите сделать, это установить стиль этого элемента управления специально для переопределения изменений темы. Это статьи дает вам немного информации.


вы можете переопределить OnPaint () панели прогресса. На самом деле вам не нужно переписывать все это, вам просто нужно унаследовать progressbar и переопределить OnPaint следующим образом:

public class my_progress_bar : ProgressBar {
        public Brush brush;
        public my_progress_bar() {
            this.SetStyle(ControlStyles.UserPaint, true);
            brush = Brushes.ForestGreen;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            //base.OnPaint(e);
            Rectangle rectangle = e.ClipRectangle;
            rectangle.Width = (int)(rectangle.Width * ((double)Value / Maximum)) - 4;
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle);
            rectangle.Height = Height - 4;
            e.Graphics.FillRectangle(brush, 2, 2, rectangle.Width, rectangle.Height);
        }
    }

вставьте это как код. Это перепишет индикатор выполнения, он также настраивается на цвет.

public class CProgressBar : ProgressBar
{

public Color MyColor {
    get { return _color; }
    set {
        _color = value;
        MyBrush = new SolidBrush(_color);
        Invalidate();
    }
}

private Color _color = Color.Green;

public CProgressBar()
{
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
}

public int Value {
    get { return _value; }
    set {
        _value = value;
        Invalidate();
    }
}

private int _value;

private SolidBrush MyBrush = new SolidBrush(_color);

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphics.FillRectangle(MyBrush, new Rectangle(0, 0, Width * (_value / Maximum), Height));
}
}