2010-05-14 24 views
10

¿Existe la posibilidad de deshabilitar la animación de la barra de progreso?Deshabilitar WinForms ProgressBar animation

Lo necesito para algunos procesos que están en pausa y no están funcionando en este momento. Un usuario promedio pensaría que el proceso se está ejecutando si la barra de progreso está parpadeando.

El consejo para crear control de barra de progreso propio no es lo que estoy buscando.

+1

¿Estás hablando de efecto gráfico de Vista? ¿Una barra de marquesina? – SLaks

+0

Sí. Efecto XP, Vista y W7. –

+0

esto puede ser relevante https://social.msdn.microsoft.com/Forums/vstudio/en-US/d223204c-24ab-4ca5-bb45-1400e3af2922/is-there-a-progress-bar-alternative-available-from -nuget-for-windows-7-that-sets-it-value-without? forum = csharpgeneral y http://stackoverflow.com/questions/37625930/cannot-get-progressbar-animation-with-code-progresschanged-not -llamado – barlop

Respuesta

18

Puede utilizar estado de pausa el avance de la barra Vista, like this:

// 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); 
+1

Eso es lo que estaba buscando. Gracias. Ese proyecto es genial: http://windowsformsaero.codeplex.com/ –

+0

Acabo de toparme con este mismo problema yo mismo. Sin embargo, una pregunta: ¿esta solución también funcionaría para el software que se ejecutará en XP, o es Vista/Win7 exclusivamente? – Nailuj

+0

@Nailuj: No funcionará en XP – SLaks

2

El medio estándar de comunicarle a un usuario que una acción está en pausa o no se puede medir con precisión es usar el estilo de visualización de marquesina.

progressBar1.Style = ProgressBarStyle.Marquee; 

Este estilo hace caso omiso de las Maximum y Value propiedades y muestra un "segmento" barra de progreso que se mueve continuamente a través de la barra de progreso y se enrolla alrededor (que no llena la barra de progreso, que se mueve lo que parece ser una sección de la barra en todo el control y alrededor del principio otra vez.)

+0

Gracias. Pero necesito Máximo y Valor. El usuario necesita ver dónde se detuvo el proceso. –

+0

@Vasily: ese es el único procedimiento independiente del sistema operativo; si tiene garantizado Vista o 7, entonces la respuesta de SLak debería resolver su problema. –

0

Lo que tendrá que hacer es establecer el estilo en este control específicamente para anular los cambios de tema. Este article le da un poco de información.

+0

http://www.codeproject.com/KB/cpp/ExtendedProgressbar.aspx se ve bien. Pero dudo que mi jefe apruebe controles de aspecto no estándar. –

-1

Se podría anular el OnPaint() de la progressbar. En realidad no tenga que volver a escribir todo el asunto, sólo hay que heredar el progressbar y anular OnPaint así:

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

Estás malinterpretando 'e.ClipRectangle'; esto no se renderizará correctamente Además, necesitas una barra estilo Vista. Llamar a 'ProgressBarRenderer.DrawHorizontalChunks' lo hará algo mejor. – SLaks

+0

'e.ClipRectangle' es el área que necesita ser repintada. Deberías usar 'this.ClientRectangle'. – SLaks

+0

Como dije en mi pregunta "El consejo de crear control de barra de progreso propio no es lo que estoy buscando". –

-1

como pega este código. Esto reescribirá la barra de progreso, también es personalizable para colorear.

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

Por cierto, está funcionando. Si alguien cuenta esto, significa que es demasiado barato para probarlo él mismo. – ad48

+0

Te siento, es muy grosero simplemente votar y ni siquiera decir por qué. Aunque hay muchos problemas con el código cuando se usa .Net 4.5: la clase debe ser parcial, MyBrush no se puede inicializar con un valor no estático, y al final no se pinta nada. ¿Qué me estoy equivocando? –

+0

Ancho * (_value/Maximum) siempre es cero debido a la conversión int. –

0

Mi solución consistía en utilizar un Panel Control en lugar de ProgressBar. Cambié BackColor, BorderStyle (a Fixed3D) y manipulo su Ancho para mostrar el nivel de progreso necesario. Supuse que el 100% del progreso es igual al ancho de la forma.

Panel as a ProgressBar