¿Cómo cambiar el color de la barra de progreso en C # .NET 3.5?

92

Me gustaría hacer dos cosas en mi barra de progreso.

  1. Cambia el color verde a rojo.
  2. Quita los bloques y hazlo de un color.

¡Cualquier información sobre esas dos cosas que me pregunto cómo lograr será muy apreciada!

Gracias.

Ivan Prodanov
fuente

Respuestas:

83

Dado que las respuestas anteriores no parecen funcionar con Visual Styles. Probablemente necesitará crear su propia clase o extender la barra de progreso:

public class NewProgressBar : ProgressBar
{
    public NewProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle rec = e.ClipRectangle;

        rec.Width = (int)(rec.Width * ((double)Value / Maximum)) - 4;
        if(ProgressBarRenderer.IsSupported)
           ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle);
        rec.Height = rec.Height - 4;
        e.Graphics.FillRectangle(Brushes.Red, 2, 2, rec.Width, rec.Height);
    }
}

EDITAR: Código actualizado para que la barra de progreso use el estilo visual para el fondo

Chris Persichetti
fuente
2
Gracias por esto, era algo con lo que podía trabajar en mi solución.
Irwin
Eso es realmente genial, gracias. Realmente me ayudó en algo en lo que estoy trabajando en este momento, aunque lo cambié para volver a pintar todo el control cada vez en lugar de solo el área especificada por e.ClipRectangle. De lo contrario, no se volvió a pintar correctamente después de que solo una parte del control fuera invalidado por otra ventana o el borde de la pantalla.
Matt Blaine
@ Matt Blaine: ¿Podría publicar su modificación como una edición de la respuesta? Creo que habrá suficientes personas interesadas en su solución completa.
Marek
@Marek Acabo de notar tu comentario. No tengo suficiente representante para editar la respuesta, así que publiqué la mía. Gracias. stackoverflow.com/questions/778678/…
Matt Blaine
3
Me doy cuenta de que esto es viejo; y me doy cuenta de que esto es una liendre (porque el Mínimo casi siempre es cero); pero el factor de escala de Ancho debe ser (((doble) Valor - (doble) Mínimo) / ((doble) Máximo - (doble) Mínimo)) para ser anal-retentivamente correcto. :)
Jesse Chisholm
122

De acuerdo, me tomó un tiempo leer todas las respuestas y enlaces. Esto es lo que obtuve de ellos:

Resultados de muestra

La respuesta aceptada deshabilita los estilos visuales, le permite establecer el color en cualquier cosa que desee, pero el resultado parece sencillo:

ingrese la descripción de la imagen aquí

Usando el siguiente método, puede obtener algo como esto en su lugar:

ingrese la descripción de la imagen aquí

Cómo

Primero, incluya esto si no lo ha hecho: using System.Runtime.InteropServices;

En segundo lugar, puede crear esta nueva clase o poner su código en una staticclase no genérica existente :

public static class ModifyProgressBarColor
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr w, IntPtr l);
    public static void SetState(this ProgressBar pBar, int state)
    {
        SendMessage(pBar.Handle, 1040, (IntPtr)state, IntPtr.Zero);
    }
}

Ahora, para usarlo, simplemente llame a:

progressBar1.SetState(2);

Tenga en cuenta el segundo parámetro en SetState, 1 = normal (verde); 2 = error (rojo); 3 = advertencia (amarillo).

¡Espero eso ayude!

usuario1032613
fuente
18
Creó un método de extensión, por lo que la llamada debe ser progressBar1.SetState (2); además de eso, ¡Gran respuesta!
Edgar Hernandez
5
Cabe señalar que esto solo está disponible en Vista +. Puede ver la documentación completa buscando PBM_SETSTATE .
Djof
¡Hermosa! Gracias
sapbucket
1
Esto es asombroso, pero rompe mi barra de progreso parcialmente, nunca se llenará al 100% ...
Norbert Boros
1
public const uint PBM_SETSTATE = 0x0410; // 1040
Andrei Krasutski
37

Esta es una versión sin parpadeos del código más aceptado que puede encontrar como respuesta a esta pregunta. Todo el mérito a los carteles de esas respuestas fatídicas. ¡Gracias Dusty, Chris, Matt y Josh!

Como la solicitud de "Fueled" en uno de los comentarios, también necesitaba una versión que se comportara un poco más ... profesionalmente. Este código mantiene los estilos como en el código anterior, pero agrega un renderizado de imágenes fuera de la pantalla y almacenamiento en búfer de gráficos (y elimina el objeto gráfico correctamente).

Resultado: todo bien y sin parpadeo. :)

public class NewProgressBar : ProgressBar
{
    public NewProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // None... Helps control the flicker.
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        const int inset = 2; // A single inset value to control teh sizing of the inner rect.

        using (Image offscreenImage = new Bitmap(this.Width, this.Height))
        {
            using (Graphics offscreen = Graphics.FromImage(offscreenImage))
            {
                Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);

                if (ProgressBarRenderer.IsSupported)
                    ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);

                rect.Inflate(new Size(-inset, -inset)); // Deflate inner rect.
                rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum));
                if (rect.Width == 0) rect.Width = 1; // Can't draw rec with width of 0.

                LinearGradientBrush brush = new LinearGradientBrush(rect, this.BackColor, this.ForeColor, LinearGradientMode.Vertical);
                offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);

                e.Graphics.DrawImage(offscreenImage, 0, 0);
            }
        }
    }
}
William Daniel
fuente
Bueno, esto es lo más cercano a la implementación original de Microsoft.
Yakup Ünyılmaz
1
Tener un bloque de uso y llamar a Dispose es en realidad un poco redundante. Sin embargo, gran respuesta.
Kevin Stricker
1
Me doy cuenta de que esto es viejo; y me doy cuenta de que esto es una liendre (porque el Mínimo casi siempre es cero); pero el factor de escala de Ancho debe ser (((doble) Valor - (doble) Mínimo) / ((doble) Máximo - (doble) Mínimo)) para ser anal-retentivamente correcto. :)
Jesse Chisholm
Cuando utilizo TextRenderer.DrawText () para dibujar texto en una imagen fuera de la pantalla, el resultado final en la pantalla se ve pixelado y no como una etiqueta que usa exactamente la misma fuente. Sin embargo, dibujar todo esto directamente en e.Graphics sin la imagen fuera de pantalla da el resultado correcto ... ¿Alguna idea de por qué?
CuriousGeorge
1
Sí, intenté blitting sin escala. Finalmente, me cambié a WPF, así que todo lo que necesito está integrado.
CuriousGeorge
28

En el diseñador, solo necesita establecer la propiedad ForeColor en el color que desee. En el caso del rojo, hay un color predefinido para él.

Para hacerlo en código (C #) haga esto:

pgs.ForeColor = Color.Red;

Editar : Oh sí, también establezca el Estilo en continuo. En código, así:

pgs.Style = System.Windows.Forms.ProgressBarStyle.Continuous;

Otra edición: también deberá eliminar la línea que dice Application.EnableVisualStyles()su Program.cs(o similar). Si no puede hacer esto porque desea que el resto de la aplicación tenga estilos visuales, le sugiero que pinte el control usted mismo o pase a WPF, ya que este tipo de cosas es fácil con WPF. Puede encontrar un tutorial sobre cómo el propietario dibuja una barra de progreso en el codeplex

dustyburwell
fuente
3
Forecolor = rojo; Color de fondo = azul; Estilo = Continuo. Nada cambió, se queda como si nunca lo hubiera tocado
Ivan Prodanov
3
bah ... vale, veo el problema. Debe deshabilitar los estilos visuales para que esto funcione con las propiedades. Probablemente esté pintando con cualquier tema que haya seleccionado. En Program.cs hay una línea que dice Application.EnableVisualStyles (). Elimina esa línea y esto funcionará. De lo contrario, deberá pintar el control usted mismo. La otra opción es usar WPF (si es posible), ya que te permite hacer este tipo de cosas con mucha facilidad.
dustyburwell
Por favor, dame más información sobre "Cómo pintarlo yo mismo".
Ivan Prodanov
1
Aquí hay un tutorial sobre cómo el propietario dibuja una barra de progreso. El proceso es demasiado complicado para un comentario. codeproject.com/KB/cpp/VistaProgressBar.aspx
dustyburwell
1
Es una pena Application.EnableVisualStyles () es la parte clave de esta solución. Desafortunadamente, esto rompe todos los demás estilos.
mr.user1065741
16

Usando las respuestas de Matt Blaine y Chris Persichetti, he creado una barra de progreso que se ve un poco mejor al tiempo que permite una elección de color infinita (básicamente cambié una línea en la solución de Matt):

ProgressBarEx:

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace QuantumConcepts.Common.Forms.UI.Controls
{
    public class ProgressBarEx : ProgressBar
    {
        public ProgressBarEx()
        {
            this.SetStyle(ControlStyles.UserPaint, true);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            LinearGradientBrush brush = null;
            Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
            double scaleFactor = (((double)Value - (double)Minimum) / ((double)Maximum - (double)Minimum));

            if (ProgressBarRenderer.IsSupported)
                ProgressBarRenderer.DrawHorizontalBar(e.Graphics, rec);

            rec.Width = (int)((rec.Width * scaleFactor) - 4);
            rec.Height -= 4;
            brush = new LinearGradientBrush(rec, this.ForeColor, this.BackColor, LinearGradientMode.Vertical);
            e.Graphics.FillRectangle(brush, 2, 2, rec.Width, rec.Height);
        }
    }
}

Uso:

progressBar.ForeColor = Color.FromArgb(255, 0, 0);
progressBar.BackColor = Color.FromArgb(150, 0, 0);

Resultados

¡Puedes usar cualquier degradado que quieras!

Descargar

https://skydrive.live.com/?cid=0EDE5D21BDC5F270&id=EDE5D21BDC5F270%21160&sc=documents#

Josh M.
fuente
2
Me doy cuenta de que esto es viejo; y me doy cuenta de que esto es una liendre (porque el Mínimo casi siempre es cero); pero el factor de escala de Ancho debe ser (((doble) Valor - (doble) Mínimo) / ((doble) Máximo - (doble) Mínimo)) para ser anal-retentivamente correcto. :)
Jesse Chisholm
Se actualizó la respuesta con su sugerencia.
Josh M.
Sé que es antiguo, pero este código generará un error una vez que alcance un valor de 4, debido a que LinearGradientBrushlee el ancho de grabación como 0. La solución más fácil es no hacer el "relleno" de 4px en el código y colocarlo en un panel o algo con relleno (si desea un borde) y se convierte rec.Width = (int)((rec.Width * scaleFactor) - 4)enrec.Width = (int)(rec.Width * scaleFactor) + 1
MiDri
14

Modificación a la respuesta de dustyburwell. (No tengo suficiente representante para editarlo yo mismo). Al igual que su respuesta, funciona con "Estilos visuales" habilitados. Puede establecer la propiedad ForeColor de la barra de progreso en la vista de diseño de cualquier formulario.

using System;
using System.Windows.Forms;
using System.Drawing;

public class ProgressBarEx : ProgressBar
{
    private SolidBrush brush = null;

    public ProgressBarEx()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (brush == null || brush.Color != this.ForeColor)
            brush = new SolidBrush(this.ForeColor);

        Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
        if (ProgressBarRenderer.IsSupported)
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, rec);
        rec.Width = (int)(rec.Width * ((double)Value / Maximum)) - 4;
        rec.Height = rec.Height - 4;
        e.Graphics.FillRectangle(brush, 2, 2, rec.Width, rec.Height);
    }
}
Matt Blaine
fuente
Esto funciona muy bien para cambiar el color de primer plano, pero parpadea mucho, mientras que el control ProgressBar predeterminado no lo hace. Alguna idea de como resolver esto?
Cargado
4
Descubrí cómo resolver el parpadeo: agregue doble búfer a los ControlStyles de ProgressBar definido por el usuario, así: SetStyle (ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, ...).
Alimentado el
Me doy cuenta de que esto es viejo; y me doy cuenta de que esto es una liendre (porque el Mínimo casi siempre es cero); pero el factor de escala de Ancho debe ser (((doble) Valor - (doble) Mínimo) / ((doble) Máximo - (doble) Mínimo)) para ser anal-retentivamente correcto. :)
Jesse Chisholm
5

Solo puse esto en una clase estática.

  const int WM_USER = 0x400;
  const int PBM_SETSTATE = WM_USER + 16;
  const int PBM_GETSTATE = WM_USER + 17;

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

  public enum ProgressBarStateEnum : int
  {
   Normal = 1,
   Error = 2,
   Paused = 3,
  }

  public static ProgressBarStateEnum GetState(this ProgressBar pBar)
  {
   return (ProgressBarStateEnum)(int)SendMessage(pBar.Handle, PBM_GETSTATE, IntPtr.Zero, IntPtr.Zero);
  }

  public static void SetState(this ProgressBar pBar, ProgressBarStateEnum state)
  {
   SendMessage(pBar.Handle, PBM_SETSTATE, (IntPtr)state, IntPtr.Zero);
  } 

Espero eso ayude,

Bagazo

Bagazo
fuente
+1: Creo que esto es lo que la mayoría de la gente quiere decir con rojo. Haciendo que muestre un estado de error.
Quantum
3

Por lo general, la barra de progreso tiene un tema o respeta las preferencias de color del usuario. Entonces, para cambiar el color, debe desactivar los estilos visuales y configurarForeColor o dibujar el control usted mismo.

En cuanto al estilo continuo en lugar de bloques, puede establecer la Stylepropiedad:

pBar.Style = ProgressBarStyle.Continuous;
Joey
fuente
2

EDITAR

Por lo que parece, estás usando el tema XP, que tiene la barra de progreso basada en bloques verdes. Intente cambiar su estilo de interfaz de usuario a Windows Classic y vuelva a realizar la prueba, pero es posible que deba implementar su propio evento OnPaint para que haga lo que desea en todos los estilos de interfaz de usuario

O como alguien más señaló, desactive VisualStyles para su aplicación.

Original

Hasta donde yo sé, la representación de la barra de progreso ocurre en línea con el estilo de tema de Windows que ha elegido (win2K, xp, vista)

Puede cambiar el color configurando la propiedad

ProgressBar.ForeColor

Sin embargo, no estoy seguro de que puedas hacer mucho más ...

busca algo en google

Aquí hay un artículo de MS KB sobre la creación de una barra de progreso "suave".

http://support.microsoft.com/kb/323116

Eoin Campbell
fuente
@ Eion, Forecolor = rojo; Color de fondo = azul; Estilo = Continuo. Nada cambió, se queda como si nunca lo hubiera tocado.
Ivan Prodanov
2

Todos estos métodos no funcionan para mí, pero este método le permite cambiarlo a una cadena de color.

Tenga en cuenta que encontré este código en otro lugar en StackOverflow y lo cambié un poco. Desde entonces he olvidado dónde encontré este código y no puedo vincularlo por eso, lo siento mucho.

Pero de todos modos espero que este código ayude a alguien, realmente me ayudó.

private void ProgressBar_MouseDown(object sender, MouseButtonEventArgs e)
    {
        var converter = new System.Windows.Media.BrushConverter();
        var brush = (Brush)converter.ConvertFromString("#FFB6D301");
        ProgressBar.Foreground = brush;
    }

Donde se use el nombre "ProgressBar" reemplácelo con el nombre de su propia barra de progreso. También puede activar este evento con otros argumentos, solo asegúrese de que esté entre corchetes en algún lugar.

EpicNinjaQueso
fuente
Buen trabajo ... Estoy usando dentro de un evento ProgressChanged para pasar de claro a oscuro ... + 1
BENN1TH
2

Cambiar Colory Value(cambio instantáneo)

Poner using System.Runtime.InteropServices;en la parte superior ...

Llamar con ColorBar.SetState(progressBar1, ColorBar.Color.Yellow, myValue);

Noté que si cambia el valor de la barra (qué tan grande es), entonces no cambiará si está en un color que no sea el verde predeterminado. Tomé el código de user1032613 y agregué una opción de Valor.

public static class ColorBar
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr w, IntPtr l);
    public enum Color { None, Green, Red, Yellow }

    public static void SetState(this ProgressBar pBar, Color newColor, int newValue)
    {
        if (pBar.Value == pBar.Minimum)  // If it has not been painted yet, paint the whole thing using defualt color...
        {                                // Max move is instant and this keeps the initial move from going out slowly 
            pBar.Value = pBar.Maximum;   // in wrong color on first painting
            SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);
        }
        pBar.Value = newValue;
        SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);     // run it out to the correct spot in default
        SendMessage(pBar.Handle, 1040, (IntPtr)(int)newColor, IntPtr.Zero);        // now turn it the correct color
    }

}
Sparfy
fuente
2
Tuvimos que voltear pBar.Value = pBar.Maximum;y SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);dentro del cuerpo de condición para que el progreso mostrara el nuevo color correcto.
DomTheDeveloper
1

En caso de que alguien busque otra opción ... puedes extender un Panel, usarlo como fondo (blanco o lo que sea), agregar otro Panel dentro de él para el primer plano (la barra móvil). Entonces tienes el control total cambiando el color, etc.

Eduardo
fuente
1

Simplemente haga clic derecho en su proyecto en Visual Basic Solution Explorer (donde están sus archivos vb) y seleccione propiedades en el menú. En la ventana que aparece, anule la selección de "Habilitar estilos visuales XP" y ahora, cuando configure el color de fondo, debería funcionar ahora.

Cachondo
fuente
0

Ojo: Cita: Por lo general, la barra de progreso tiene un tema o respeta las preferencias de color del usuario. Entonces, para cambiar el color, debe desactivar los estilos visuales y configurarForeColor o dibujar el control usted mismo.

En cuanto al estilo continuo en lugar de bloques, puede establecer la Stylepropiedad:

pBar.Style = ProgressBarStyle.Continuous;

ProgressBarStyle.Continuous versus Blocks es inútil con VistualStyles habilitado ...

Los bloques solo funcionarán con los estilos visuales deshabilitados ... lo que hace que todo esto sea un punto discutible (con respecto al color de progreso personalizado) Con los estilos visuales deshabilitados ... la barra de progreso debe ser coloreada según el color anterior.

Usé una combinación de la respuesta de William Daniel (con los estilos visuales habilitados, por lo que ForeColor no solo será plano sin estilo) y la respuesta de Barry (al texto personalizado en la barra de progreso) de: ¿Cómo coloco texto en ProgressBar?

NeoH4x0r
fuente
0

Barra vertical ARRIBA Para Abajo en color rojo:

using System;
using System.Windows.Forms;
using System.Drawing;



public class VerticalProgressBar : ProgressBar
{


    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.Style |= 0x04;
            return cp;

        }
    }
    private SolidBrush brush = null;

    public VerticalProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (brush == null || brush.Color != this.ForeColor)
            brush = new SolidBrush(this.ForeColor);

        Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
        if (ProgressBarRenderer.IsSupported)
        ProgressBarRenderer.DrawVerticalBar(e.Graphics, rec);
        rec.Height = (int)(rec.Height * ((double)Value / Maximum)) - 4;
        rec.Width = rec.Width - 4;
        e.Graphics.FillRectangle(brush, 2, 2, rec.Width, rec.Height);

    } 
}
Mandrova
fuente
¿Puede explicar en texto o en comentarios al código cómo esto resuelve el problema?
Harrison
Me doy cuenta de que esto es una liendre (porque el Mínimo casi siempre es cero); pero el factor de escala de altura debe ser (((doble) Valor - (doble) Mínimo) / ((doble) Máximo - (doble) Mínimo)) para ser anal-retentivamente correcto. :)
Jesse Chisholm
0

La barra de progreso de color de VB.Net que respeta la respuesta de WXP Visual Styles es ...

Comencé con la respuesta de 'user1032613' el 17/03/12. Tenga en cuenta que esto ahora es un módulo, no una clase. A partir de ahí convertí el código pero se necesitaba más. En particular, el código convertido mostró una función DirectCast para convertir el entero 'estado' a un tipo IntPtr que no funcionó.

Imports System.Runtime.InteropServices

Public Module ModifyProgressBarColor

    Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long

    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
    Private Function SendMessage(hWnd As IntPtr, Msg As UInteger, w As IntPtr, l As IntPtr) As IntPtr
    End Function

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub SetState(pBar As ProgressBar, state As Integer)

        '-- Convert state as integer to type IntPtr
        Dim s As IntPtr
        Dim y As Integer = state
        s = IntPtr.op_Explicit(y)

        '-- Modify bar color
        SendMessage(pBar.Handle, 1040, s, IntPtr.Zero)

    End Sub

End Module

Y nuevamente simplemente llame a esto en el código de uso con esta línea:

Call ModifyProgressBarColor.SetState(prb, 2)

Por cierto, probé otros colores, 0, 4, 5, todos se muestran en verde.

DanW52
fuente
0

Sé que es demasiado viejo para ser respondido ahora ... pero aún así, un pequeño ajuste a @ Daniel la respuesta de para rectificar el problema de no mostrar la barra de progreso con valor cero. Simplemente dibuje el Progreso solo si se encuentra que el ancho del rectángulo interior no es cero.

Gracias a todos los contribuyentes.

        public class ProgressBarEx : ProgressBar
        {
            public ProgressBarEx()
            {
                this.SetStyle(ControlStyles.UserPaint, true);
            }

            protected override void OnPaintBackground(PaintEventArgs pevent){}
                // None... Helps control the flicker.                

            protected override void OnPaint(PaintEventArgs e)
            {
                const int inset = 2; // A single inset value to control teh sizing of the inner rect.

                using (Image offscreenImage = new Bitmap(this.Width, this.Height))
                {
                    using (Graphics offscreen = Graphics.FromImage(offscreenImage))
                    {
                        Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);

                        if (ProgressBarRenderer.IsSupported)
                            ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);

                        rect.Inflate(new Size(-inset, -inset)); // Deflate inner rect.
                        rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum));

                        if (rect.Width != 0)
                        {
                            LinearGradientBrush brush = new LinearGradientBrush(rect, this.ForeColor, this.BackColor, LinearGradientMode.Vertical);
                            offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);
                            e.Graphics.DrawImage(offscreenImage, 0, 0);
                            offscreenImage.Dispose();
                        }
                    }
                }
            }
        }
Divins Mathew
fuente
0

Descubrí que esto se puede hacer dibujando un rectángulo dentro de la barra de progreso y estableciendo su ancho de acuerdo con el valor actual del progreso. También agregué soporte para el progreso de derecha a izquierda. De esta forma no es necesario utilizar la imagen, y dado que Rectnalge.Inflate no se llama, el rectángulo dibujado es más pequeño.

public partial class CFProgressBar : ProgressBar
{
    public CFProgressBar()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent) { }

    protected override void OnPaint(PaintEventArgs e)
    {
        double scaleFactor = (((double)Value - (double)Minimum) / ((double)Maximum - (double)Minimum));
        int currentWidth = (int)((double)Width * scaleFactor);
        Rectangle rect;
        if (this.RightToLeftLayout)
        {
            int currentX = Width - currentWidth;
            rect = new Rectangle(currentX, 0, this.Width, this.Height);
        }
        else
            rect = new Rectangle(0, 0, currentWidth, this.Height);

        if (rect.Width != 0)
        {
            SolidBrush sBrush = new SolidBrush(ForeColor);
            e.Graphics.FillRectangle(sBrush, rect);
        }
    }
}
ZOK
fuente
0

Creo que la solución más simple de todas, es solo una solución rápida, pero puede eliminar, comentar Application.EnableVisualStyles () de Program.cs, o como quiera que haya nombrado la parte que contiene la función Main. Después de eso, puede cambiar libremente el color de la barra de progreso mediante progressBar.ForeColor = Color.TheColorYouDesire;

static void Main()
        {
            //Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
         }
Mladen Tasevski
fuente
-5

Editar: en los dos minutos me tomó encender vs y verificar la sintaxis, me golpearon con respuestas mucho mejores. me encanta este sitio.

        progressBar1 = new ProgressBar();
        progressBar1.ForeColor = Color.Red;
Fusspawn
fuente
2
No funciona Permanece vacío ahora, agregué progressBar1.value = 50, pero aún está vacío
Ivan Prodanov
intentado establecer el valor máximo? progressBar1 = new ProgressBar (); progressBar1.ForeColor = Color.Red; progressBar1.Maximum = 100;
Fusspawn
2
No, el problema está en mi tema de Windows.
Ivan Prodanov
No tengo idea de si esto funcionará, pero intente comentar Application.EnableVisualThemes (); que está en uno de los archivos prediseñados vs generate's (no recuerdo cuál)
Fusspawn
1
Application.EnableVisualStyles () lo siento, no temas
Fusspawn