Comment changer la couleur de progressbar dans C#.NET 3,5?

je voudrais faire deux choses sur ma barre de progression.

  1. changer la couleur verte en rouge.
  2. enlever les blocs et le faire en une seule couleur.

toute information sur ces deux choses que je me demande comment accomplir sera grandement appréaciée!

Merci.

79
demandé sur Joel Coehoorn 2009-04-22 23:02:20

21 réponses

puisque les réponses précédentes ne semblent pas fonctionner avec les Styles visuels. Vous aurez probablement besoin de créer votre propre classe ou d'étendre la barre de progression:

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);
    }
}

modifier: code mis à jour pour faire la barre de progression utiliser le style visuel pour l'arrière-plan

65
répondu Crispy 2009-04-23 19:36:04

OK, il m'a fallu un certain temps pour lire toutes les réponses et les liens. Voici ce que j'en ai tiré:

Résultats De L'Échantillon

la réponse acceptée désactive les styles visuels, il ne vous permet de définir la couleur à tout ce que vous voulez, mais le résultat semble simple:

enter image description here

en utilisant la méthode suivante, vous pouvez obtenir quelque chose comme ceci à la place:

enter image description here

Comment Faire

tout d'abord, incluez ceci si vous n'avez pas: using System.Runtime.InteropServices;

Deuxièmement, vous pouvez créer cette nouvelle classe, ou mettre son code dans une static non-generic class:

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);
    }
}

Maintenant, pour l'utiliser, il suffit d'appeler:

ModifyProgressBarColor.SetState(progressBar1, 2);

Notez le second paramètre dans SetState, 1 = normal (vert); 2 = erreur (rouge); 3 = avertissement (jaune).

Espère que cela aide!

97
répondu user1032613 2013-09-13 15:27:12

c'est une version sans clignotant du code le plus accepté que vous pouvez trouver comme réponses à cette question. Tout le mérite revient aux affiches de ces réponses fatales. Merci Dusty, Chris, Matt et Josh!

comme la requête de"Fueled" dans un des commentaires, j'avais aussi besoin d'une version qui se comportait un peu plus... consciencieusement. Ce code maintient les styles comme dans le code précédent, mais ajoute un rendu d'image hors-écran et le tampon graphique (et dispose de l'objet graphique correctement.)

Résultat: tout le bien, et pas de scintillement. :)

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);
                offscreenImage.Dispose();
            }
        }
    }
}
30
répondu William Daniel 2011-09-23 13:51:46

dans le designer, vous avez juste besoin de mettre la propriété de ForeColor à n'importe quelle couleur que vous voudriez. Dans le cas du rouge, il y a une couleur prédéfinie.

À faire dans le code (C#) faire:

pgs.ForeColor = Color.Red;

Modifier : Ah oui, aussi définir le Style du continu. En code, comme ceci:

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

un autre Edit: vous aurez également besoin de supprimer la ligne qui lit Application.EnableVisualStyles() de votre Program.cs (ou similaire). Si vous ne pouvez pas le faire parce que vous voulez que le reste de l'application ait des styles visuels, alors je suggère de peindre le contrôle vous-même ou passer à WPF puisque ce genre de chose est facile avec WPF. Vous pouvez trouver un tutoriel sur le propriétaire dessinant une barre de progression sur codeplex

27
répondu dustyburwell 2009-05-05 15:29:32

modifie la réponse de dustyburwell. (Je n'ai pas assez de rep pour le modifier moi-même. Comme sa réponse, il fonctionne avec "Visual Styles" activé. Vous pouvez simplement définir la propriété ForeColor de la progressbar dans n'importe quelle forme de vue de conception.

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);
    }
}
14
répondu Matt Blaine 2010-03-23 06:46:48

en utilisant les réponses de Matt Blaine et Chris Persichetti, j'ai créé une barre de progression qui semble un peu plus belle tout en permettant un choix de couleur infini (en gros, j'ai changé une ligne dans la solution 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);
        }
    }
}

Utilisation:

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

résultats

You can use any gradient you like!

télécharger

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

14
répondu Josh M. 2014-09-03 17:17:09

j'ai mis ça dans une classe statique.

  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);
  } 

Espérons que cela aide,

Marc

5
répondu Marc 2010-05-31 14:22:23

habituellement, la barre de progression est soit thématique ou honore les préférences de couleur de l'utilisateur. Donc, pour changer la couleur que vous avez besoin soit d'éteindre les styles visuels et de mettre ForeColor ou de tirer le contrôle vous-même.

quant au style continu au lieu de blocs, vous pouvez définir la propriété Style :

pBar.Style = ProgressBarStyle.Continuous;
3
répondu Joey 2009-04-22 19:11:53

MODIFIER

Par les sons de choses que vous êtes en utilisant le Thème XP qui a le bloc vert en fonction prog-bar. Essayez de retourner votre style D'interface utilisateur à Windows Classic et tester à nouveau, mais vous devrez peut-être mettre en œuvre votre propre événement OnPaint pour l'obtenir de faire ce que vous voulez à travers tous les Styles D'interface utilisateur

ou comme quelqu'un d'autre l'a souligné, désactiver les styles de visualisation pour votre application.

Original

autant que je sache, le rendu de la barre de progression s'effectue en ligne avec le style de thème windows que vous avez choisi (win2K, xp, vista)

Vous pouvez changer la couleur en définissant la propriété

ProgressBar.ForeColor

Je ne suis pas sûr que vous puissiez faire beaucoup plus...

fait un peu de googling

il y a ici un article de MS KB sur la création d'une barre de progression" lisse"

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

2
répondu Eoin Campbell 2009-04-22 19:25:37

je vous suggère de prendre également un oeil à cet article sur Codeprojet: Progress-O-Doom . C'est génial!

2
répondu Drake 2010-05-31 14:50:16

essayez d'utiliser messsage PBM_SETBARCOLOR, qui devrait faire l'affaire avec SendMessage

voir http://www.vbforums.com/showthread.php?t=248721 pour un exemple.

2
répondu Aleksandar 2012-02-23 07:57:48

Toutes ces méthodes ne fonctionnent pas pour moi, mais cette méthode vous permet de vous changer en une chaîne de couleur.

veuillez noter que j'ai trouvé ce code d'un autre endroit sur StackOverflow et je l'ai changé un peu. J'ai depuis oublié où j'ai trouvé ce code et je ne peux pas le relier à cause de cela tellement désolé pour cela.

mais de toute façon j'espère que ce code aidera quelqu'un qu'il m'a vraiment aidé.

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

où le nom "ProgressBar" est utilisé remplacer par votre propre barre de progression de nom. Vous pouvez aussi déclencher cet événement avec d'autres arguments, assurez-vous simplement qu'il est placé entre crochets quelque part.

2
répondu EpicNinjaCheese 2014-10-27 02:44:27

Changement Color et Value ( le changement instantané )

mettez using System.Runtime.InteropServices; en haut...

appel avec ColorBar.SetState(progressBar1, ColorBar.Color.Yellow, myValue);

j'ai remarqué que si vous changez la valeur de la barre ( sa taille), elle ne changera pas si elle est dans une couleur autre que le vert par défaut. J'ai pris le code de user1032613 et ajouté une option de valeur.

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
    }

}
2
répondu Sparfy 2016-11-16 15:13:32

Juste au cas où quelqu'un cherche une autre option.... vous pouvez étendre un panneau, l'utiliser comme fond (blanc ou autre), Ajouter un autre panneau à l'intérieur pour le premier plan (la barre mobile). Ensuite, vous avez le contrôle total de changer la couleur, etc.

1
répondu Eduardo 2011-01-28 15:05:49

cliquez simplement avec le bouton droit de la souris sur votre projet dans Visual Basic Solution Explorer (où se trouvent vos fichiers vb) et sélectionnez Propriétés dans le menu. Dans la fenêtre qui apparaît désélectionner "activer les Styles visuels XP" et maintenant lorsque vous définissez forecolor, il devrait fonctionner maintenant.

1
répondu Randy 2011-09-26 00:12:17

: Habituellement, la barre de progression est soit themed ou honore les préférences de couleur de l'utilisateur. Donc, pour changer la couleur que vous avez besoin soit d'éteindre les styles visuels et de mettre ForeColor ou de tirer le contrôle vous-même.

quant au style continu au lieu de blocs, vous pouvez définir la propriété Style :

pBar.Style = ProgressBarStyle.Continuous;

ProgressBarStyle.Continu versus Blocks est inutile avec VistualStyles activé...

bloc (s) ne fonctionnera que si les styles visuels sont désactivés ... ce qui rend un point discutable (en ce qui concerne progression personnalisée couleur) Avec des styles visuels désactivés ... la barre de progression doit être colorée en fonction du forecolor.

j'ai utilisé une combinaison de la réponse de William Daniel (avec les styles visuels activés, de sorte que le ForeColor ne sera pas seulement plat avec aucun style) et Réponse de Barry (texte personnalisé sur la barre de progression) de: Comment puis-je envoyer un sms sur ProgressBar?

0
répondu NeoH4x0r 2017-05-23 12:10:33

barre verticale haut pour bas en couleur rouge:

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);

    } 
}
0
répondu Mandrova 2013-10-10 20:44:00

le VB.Net couleur progressbar qui respecte les Styles visuels WXP réponse est ...

j'ai commencé avec la réponse de 'user1032613' le 3/17/12. Notez que c'est maintenant un Module, pas une classe. De là, j'ai converti le code, mais il en fallait plus. En particulier le code converti a montré une fonction DirectCast pour convertir l'entier 'state' en un type IntPtr qui n'a pas fonctionné.

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

et encore il suffit de l'appeler dans le code d'utilisation avec cette ligne:

Call ModifyProgressBarColor.SetState(prb, 2)

BTW - j'ai essayé d'autres couleurs - 0, 4, 5 - ils tous juste affiché Vert.

0
répondu DanW52 2013-10-28 16:26:45

je connais son chemin trop vieux pour être répondu maintenant.. mais tout de même, un petit tweak à @ Daniel 'S réponse pour corriger le problème de ne pas montrer zéro valeur barre de progrès. Il suffit de dessiner la progression seulement si la largeur du rectangle intérieur est non nulle.

Merci à tous les contributeurs.

        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();
                        }
                    }
                }
            }
        }
0
répondu Divins Mathew 2017-05-23 11:54:50

j'ai trouvé que cela peut être fait en dessinant un rectangle à l'intérieur de la barre de progression, et de définir sa largeur en fonction de la valeur courante de la progression. J'ai également ajouté mon soutien au progrès de droite à gauche. De cette façon, vous n'avez pas besoin d'utiliser l'Image, et depuis Rectnalge.Gonflez n'est pas appelé le rectangle dessiné est plus petit.

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);
        }
    }
}
0
répondu ZOK 2018-07-15 10:54:29

Edit: dans les deux minuites il m'a fallu pour le feu jusqu'à vs et vérifier la syntaxe j'ai été battu avec beaucoup de meilleures réponses. j'adore ce site.

        progressBar1 = new ProgressBar();
        progressBar1.ForeColor = Color.Red;
-5
répondu Fusspawn 2009-04-22 19:10:58