Существует ли possbility для отключения анимации индикатора выполнения?
Мне нужен он для некоторого pocess, который приостанавливается и не работающий в данный момент. Средний пользователь думал бы, что процесс работает, если индикатор выполнения является миганием.
Совет создать собственное управление индикатором выполнения не то, что я ищу.
Вы можете использовать состояние паузы в индикаторе прогресса 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;
Этот стиль игнорирует свойства Максимальное
и Значение
и отображает "сегмент" индикатора выполнения, который постоянно перемещается по индикатору выполнения и зацикливается (он не заполняет индикатор выполнения , он перемещает то, что выглядит как часть полосы, полностью через элемент управления и снова в начало.)
Вы можете переопределить 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);
}
}