Como alterar a cor da barra de progresso em C # .NET 3.5?

91

Eu gostaria de fazer duas coisas na minha barra de progresso.

  1. Mude a cor verde para vermelho.
  2. Remova os blocos e faça em uma cor.

Qualquer informação sobre essas duas coisas que me pergunto como realizar será muito apreciada!

Obrigado.

Ivan Prodanov
fonte

Respostas:

82

Uma vez que as respostas anteriores não parecem funcionar com estilos visuais. Você provavelmente precisará criar sua própria classe ou estender a barra de progresso:

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 atualizado para fazer a barra de progresso usar o estilo visual para o fundo

Chris Persichetti
fonte
2
Obrigado por isso, era algo com que eu poderia trabalhar na minha solução.
Irwin
Isso é muito legal, obrigado. Isso realmente me ajudou em algo em que estou trabalhando no momento, embora eu tenha mudado para redesenhar todo o controle a cada vez, em vez de apenas a área especificada por e.ClipRectangle. Caso contrário, ele não repintou corretamente depois que apenas parte do controle foi invalidado por outra janela ou a borda da tela.
Matt Blaine
@Matt Blaine: Você poderia postar sua modificação como uma edição da resposta? Acredito que haverá um número suficiente de pessoas interessadas em sua solução completa.
Marek de
@Marek Acabei de notar seu comentário. Não tenho representantes suficientes para editar a resposta, então postei a minha. Obrigado. stackoverflow.com/questions/778678/…
Matt Blaine
3
Eu sei que isso é antigo; e eu percebo que isso é um nit (porque o mínimo é quase sempre zero); mas o fator de escala de Largura deve ser (((duplo) Valor - (duplo) Mínimo) / ((duplo) Máximo - (duplo) Mínimo)) para ser retentivamente correto. :)
Jesse Chisholm
121

OK, demorei um pouco para ler todas as respostas e links. Aqui está o que consegui com eles:

Resultados da amostra

A resposta aceita desativa os estilos visuais, permite que você defina a cor que quiser, mas o resultado parece simples:

insira a descrição da imagem aqui

Usando o método a seguir, você pode obter algo assim:

insira a descrição da imagem aqui

Como

Primeiro, inclua se você não tiver: using System.Runtime.InteropServices;

Em segundo lugar, você pode criar essa nova classe ou colocar seu código em uma staticclasse não 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);
    }
}

Agora, para usá-lo, basta chamar:

progressBar1.SetState(2);

Observe o segundo parâmetro em SetState, 1 = normal (verde); 2 = erro (vermelho); 3 = aviso (amarelo).

Espero que ajude!

user1032613
fonte
18
Você criou um método de extensão, então a chamada deve ser progressBar1.SetState (2); além disso, ótima resposta!
Edgar Hernandez
5
Deve-se notar que isso está disponível apenas no Vista +. Você pode ver a documentação completa pesquisando PBM_SETSTATE .
Djof
Lindo! Obrigado
sapbucket
1
Isso é incrível, mas quebra minha barra de progresso parcialmente, nunca vai preencher 100% ...
Norbert Boros
1
public const uint PBM_SETSTATE = 0x0410; // 1040
Andrei Krasutski
37

Esta é uma versão sem cintilação do código mais aceito que você pode encontrar como resposta a esta pergunta. Todo o crédito para os cartazes dessas respostas fatasticas. Obrigado Dusty, Chris, Matt e Josh!

Assim como o pedido de "Fueled" em um dos comentários, eu também precisava de uma versão que se comportasse um pouco mais ... profissionalmente. Este código mantém os estilos como no código anterior, mas adiciona uma renderização de imagem fora da tela e armazenamento em buffer de gráficos (e descarta o objeto gráfico corretamente).

Resultado: tudo de bom e sem oscilações. :)

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
fonte
Bem, este é o mais próximo da implementação original da Microsoft.
Yakup Ünyılmaz
1
Ter um bloco using e chamar Dispose é na verdade um pouco redundante. Ótima resposta.
Kevin Stricker
1
Eu sei que isso é antigo; e eu percebo que isso é um nit (porque o mínimo é quase sempre zero); mas o fator de escala de Largura deve ser (((duplo) Valor - (duplo) Mínimo) / ((duplo) Máximo - (duplo) Mínimo)) para ser retentivamente correto. :)
Jesse Chisholm
Quando eu uso TextRenderer.DrawText () para desenhar texto em imagem fora da tela, o resultado final na tela parece pixelado, e não como um rótulo usando exatamente a mesma fonte. Desenhar tudo isso diretamente para e.Graphics sem o offscreenimager fornece o resultado correto ... Alguma idéia por quê?
CuriousGeorge
1
Sim, eu tentei blit sem escala. Finalmente, mudei para o WPF, então tudo que eu preciso está integrado.
CuriousGeorge
28

No designer, você só precisa definir a propriedade ForeColor para a cor que desejar. No caso do vermelho, existe uma cor predefinida para ele.

Para fazer isso em código (C #), faça o seguinte:

pgs.ForeColor = Color.Red;

Edit : Oh yeah, também defina o estilo para contínuo. Em código, como este:

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

Outra edição: você também precisará remover a linha que lê Application.EnableVisualStyles()de seu Program.cs(ou similar). Se você não pode fazer isso porque deseja que o restante do aplicativo tenha estilos visuais, sugiro pintar o controle você mesmo ou passar para o WPF, pois esse tipo de coisa é fácil com o WPF. Você pode encontrar um tutorial sobre como o proprietário desenha uma barra de progresso no codeplex

Poço de Poeira
fonte
3
Forecolor = vermelho; Backcolor = azul; Estilo = Contínuo. Nada mudou, vai ficar como se eu nunca
tivesse
3
bah ... ok, eu vejo o problema. Você precisa desativar os estilos visuais para que isso funcione com as propriedades. Provavelmente está pintando usando qualquer tema que você selecionou. Em Program.cs, há uma linha que diz Application.EnableVisualStyles (). Remova essa linha e isso funcionará. Caso contrário, você precisará pintar o controle sozinho. A outra opção é usar o WPF (se houver possibilidade), pois ele permite que você faça esse tipo de coisa com muita facilidade.
dustyburwell
Dê-me mais informações sobre "Como pintar sozinho".
Ivan Prodanov,
1
Aqui está um tutorial sobre como o proprietário desenha uma barra de progresso. O processo é muito complicado para um comentário. codeproject.com/KB/cpp/VistaProgressBar.aspx
dustyburwell
1
É uma pena que Application.EnableVisualStyles () seja a parte principal desta solução. Infelizmente, isso quebra todos os outros estilos.
mr.user1065741
16

Usando as respostas de Matt Blaine e Chris Persichetti, criei uma barra de progresso que parece um pouco melhor, permitindo uma escolha infinita de cores (basicamente, mudei uma linha na solução 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

Você pode usar qualquer gradiente que desejar!

Baixar

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

Josh M.
fonte
2
Eu sei que isso é antigo; e eu percebo que isso é um nit (porque o mínimo é quase sempre zero); mas o fator de escala de Largura deve ser (((duplo) Valor - (duplo) Mínimo) / ((duplo) Máximo - (duplo) Mínimo)) para ser retentivamente correto. :)
Jesse Chisholm
Atualizado a resposta c / sua sugestão.
Josh M.
Eu sei que é antigo, mas - este código apresentará um erro quando atingir um valor de 4, devido à LinearGradientBrushleitura da largura de rec como 0. A correção mais fácil é não fazer o "preenchimento" de 4px no código e colocá-lo em um painel ou algo com preenchimento (se você quiser uma borda) e transformando rec.Width = (int)((rec.Width * scaleFactor) - 4)emrec.Width = (int)(rec.Width * scaleFactor) + 1
MiDri
14

Modificação para a resposta de Dustyburwell. (Não tenho representantes suficientes para editar sozinho.) Como sua resposta, funciona com "Estilos visuais" habilitado. Você pode apenas definir a propriedade ForeColor da barra de progresso em qualquer visualização de design do formulário.

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
fonte
Isso funciona muito bem para alterar a cor do primeiro plano, mas pisca muito, enquanto o controle ProgressBar padrão não. Alguma idéia de como resolver isso?
Abastecido em
4
Eu descobri como resolver a cintilação: adicione buffer duplo aos ControlStyles do ProgressBar definido pelo usuário, assim: SetStyle (ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, ...).
Abastecido em
Eu sei que isso é antigo; e eu percebo que isso é um nit (porque o mínimo é quase sempre zero); mas o fator de escala de Largura deve ser (((duplo) Valor - (duplo) Mínimo) / ((duplo) Máximo - (duplo) Mínimo)) para ser retentivamente correto. :)
Jesse Chisholm
5

Acabei de colocar isso em uma classe 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 que ajude,

Marc

Marc
fonte
+1: Acho que é isso que a maioria das pessoas entende por vermelho. Fazendo com que mostre um estado de erro.
quantum
3

Normalmente, a barra de progresso é temática ou respeita as preferências de cor do usuário. Portanto, para alterar a cor, você precisa desligar os estilos visuais e definirForeColor ou desenhar o controle você mesmo.

Quanto ao estilo contínuo em vez de blocos, você pode definir a Stylepropriedade:

pBar.Style = ProgressBarStyle.Continuous;
Joey
fonte
2

EDITAR

Pelo som das coisas, você está usando o Tema XP que tem a barra de programação baseada em blocos verdes. Tente mudar seu estilo de interface do usuário para o Windows Classic e teste novamente, mas pode ser necessário implementar seu próprio evento OnPaint para fazer o que você deseja em todos os estilos de interface do usuário

Ou como alguém apontou, desative os VisualStyles para seu aplicativo.

Original

Pelo que eu sei, a renderização da barra de progresso acontece em linha com o estilo de tema do Windows que você escolheu (win2K, xp, vista)

Você pode alterar a cor definindo a propriedade

ProgressBar.ForeColor

Não tenho certeza se você pode fazer muito mais ...

faz alguma pesquisa no Google

Há um artigo aqui do MS KB sobre como criar uma barra de progresso "Suave"

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

Eoin Campbell
fonte
@ Eion, Forecolor = red; Backcolor = azul; Estilo = Contínuo. Nada mudou, é como se eu nunca tivesse tocado nisso.
Ivan Prodanov,
2

Todos esses métodos não funcionam para mim, mas este método permite que você altere para uma seqüência de cores.

Observe que encontrei esse código em outro lugar no StackOverflow e o alterei um pouco. Desde então, esqueci onde encontrei este código e não consigo vinculá-lo por causa disso, sinto muito por isso.

Mas, de qualquer forma, espero que este código ajude alguém, ele realmente me ajudou.

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

Onde o nome "ProgressBar" é usado, substitua pelo nome da sua própria barra de progresso. Você também pode acionar este evento com outros argumentos, apenas certifique-se de que ele esteja entre colchetes em algum lugar.

EpicNinjaCheese
fonte
bom trabalho .. Estou usando dentro de um evento ProgressChanged para ir da luz para a escuridão ... + 1
BENN1TH
2

Mudança Colore Value(mudança instantânea)

Coloque using System.Runtime.InteropServices;no topo ...

Ligue com ColorBar.SetState(progressBar1, ColorBar.Color.Yellow, myValue);

Percebi que se você alterar o valor da barra (quão grande ela é), ela não mudará se estiver em uma cor diferente do verde padrão. Peguei o código do user1032613 e adicionei uma opção 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
fonte
2
Tivemos que virar pBar.Value = pBar.Maximum;e SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);dentro do corpo-condição para que o progresso mostrasse a nova cor correta.
DomTheDeveloper
1

Caso alguém procure outra opção .... você pode estender um Painel, usá-lo como fundo (branco ou qualquer outro), adicionar outro Painel dentro dele para o primeiro plano (a barra móvel). Então você tem controle total ao mudar a cor, etc.

Eduardo
fonte
1

Simplesmente clique com o botão direito em seu projeto no Visual Basic Solution Explorer (onde estão seus arquivos vb) e selecione propriedades no menu. Na janela que aparece, desmarque "Ativar estilos visuais do XP" e agora, quando você definir forecolor, ele deve funcionar agora.

Randy
fonte
0

Pergunta: Citação: Normalmente, a barra de progresso é temática ou respeita as preferências de cor do usuário. Portanto, para alterar a cor, você precisa desligar os estilos visuais e definirForeColor ou desenhar o controle você mesmo.

Quanto ao estilo contínuo em vez de blocos, você pode definir a Stylepropriedade:

pBar.Style = ProgressBarStyle.Continuous;

ProgressBarStyle.Continuous versus Blocks é inútil com VistualStyles habilitado ...

O (s) bloco (s) só funcionarão com estilos visuais desativados ... o que torna tudo isso um ponto discutível (com relação à cor de progresso personalizada). Com estilos de visitas desativados ... a barra de progresso deve ser colorida com base na cor principal.

Usei uma combinação da resposta de William Daniel (com estilos visuais habilitados, para que o ForeColor não fique apenas plano, sem estilo) e a resposta de Barry (para texto personalizado na barra de progresso) de: Como coloco texto na ProgressBar?

NeoH4x0r
fonte
0

Barra vertical UP For Down na cor vermelha:

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
fonte
Você pode explicar em texto ou em comentários ao código como isso resolve o problema.
Harrison
Sei que isso é um nit (porque o mínimo é quase sempre zero); mas o fator de escala de Altura deve ser (((duplo) Valor - (duplo) Mínimo) / ((duplo) Máximo - (duplo) Mínimo)) para ser retentivamente correto. :)
Jesse Chisholm
0

A barra de progresso colorida VB.Net que respeita a resposta dos estilos visuais WXP é ...

Comecei com a resposta de 'user1032613' em 17/03/12. Observe que agora isso é um módulo, não uma classe. A partir daí, converti o código, mas era necessário mais. Em particular, o código convertido mostrou uma função DirectCast para converter o inteiro 'estado' em um tipo IntPtr que não funcionou.

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

E, novamente, basta chamar isso no código using com esta linha:

Call ModifyProgressBarColor.SetState(prb, 2)

BTW - eu tentei outras cores - 0, 4, 5 - todas exibiam apenas verde.

DanW52
fonte
0

Eu sei que é muito antigo para ser respondido agora .. mas ainda assim, um pequeno ajuste no @Daniel resposta 's para corrigir o problema de não mostrar zero, barra de progresso valorizado. Apenas desenhe o progresso apenas se a largura do retângulo interno for diferente de zero.

Obrigado a todos os contribuintes.

        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
fonte
0

Descobri que isso pode ser feito desenhando um retângulo dentro da barra de progresso e definindo sua largura de acordo com o valor atual do progresso. Eu também adicionei suporte para o progresso da direita para a esquerda. Desta forma, você não precisa usar a imagem e, como Rectnalge.Inflate não é chamado, o retângulo desenhado é menor.

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
fonte
0

Acho que a solução mais simples de todas, é só um conserto rápido, mas você pode deletar, comentar o Application.EnableVisualStyles () do Program.cs, ou entretanto você tem o nome da parte que contém a função Main. Depois disso, você pode alterar livremente a cor da barra de progresso por progressBar.ForeColor = Color.TheColorYouDesire;

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

Edit: nos dois minutos, demorei para acionar o vs e verificar a sintaxe que recebi com respostas muito melhores. eu amo este site.

        progressBar1 = new ProgressBar();
        progressBar1.ForeColor = Color.Red;
Fusspawn
fonte
2
Não funciona. Permanece vazio agora, adicionei progressBar1.value = 50, mas ainda está vazio
Ivan Prodanov,
tentou definir o valor máximo? progressBar1 = novo ProgressBar (); progressBar1.ForeColor = Color.Red; progressBar1.Maximum = 100;
Fusspawn de
2
Não, o problema está no tema do meu Windows.
Ivan Prodanov,
Não tenho ideia se isso vai funcionar, mas tente comentar Application.EnableVisualThemes (); que está em um dos arquivos pré-construídos vs gerar (não me lembro qual)
Fusspawn
1
Application.EnableVisualStyles () desculpe, não temas
Fusspawn