Отключить анимацию WinForms ProgressBar - PullRequest
12 голосов
/ 14 мая 2010

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

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

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

Ответы [ 6 ]

20 голосов
/ 14 мая 2010

Вы можете использовать приостановленное состояние индикатора выполнения 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);
2 голосов
/ 18 ноября 2017

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

Panel as a ProgressBar

2 голосов
/ 14 мая 2010

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

progressBar1.Style = ProgressBarStyle.Marquee;

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

0 голосов
/ 27 декабря 2016

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

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));
}
}
0 голосов
/ 14 мая 2010

Вы можете переопределить OnPaint () индикатора выполнения. На самом деле вам не нужно переписывать все это, вы просто должны наследовать индикатор выполнения и переопределять 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);
        }
    }
0 голосов
/ 14 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...