C#.NET 3.5でプログレスバーの色を変更するにはどうすればよいですか?


91

プログレスバーで2つのことを行いたいのですが。

  1. 緑色を赤色に変更します。
  2. ブロックを外して単色にします。

達成する方法について私が疑問に思うこれら2つのことについての情報は、非常に理解されます!

ありがとう。

回答:


82

以前の回答は、ビジュアルスタイルでは機能しないようです。おそらく、独自のクラスを作成するか、進行状況バーを拡張する必要があります。

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

編集:プログレスバーが背景の視覚スタイルを使用するようにコードを更新しました


2
このおかげで、それは私のソリューションで作業できるものでした。
アーウィン

本当にありがとうございます。e.ClipRectangleで指定された領域だけでなく、毎回コントロール全体を再描画するように変更しましたが、それは現在私が現在取り組んでいることを本当に助けてくれました。そうしないと、コントロールの一部のみが別のウィンドウまたは画面の端によって無効化された後で、正しく再描画されませんでした。
マットブレイン

@Matt Blaine:修正を回答の編集として投稿していただけませんか?私はあなたの完全な解決策に興味を持つ人々が十分にいると信じています。
Marek

@Marekコメントに気づきました。回答を編集するのに十分な担当者がいないため、自分で投稿しました。ありがとう。stackoverflow.com/questions/778678/...
マット・ブレイン

3
これは古いことに気づきました。そして、私はこれがほんのわずかであることを認識しています(最小値はほとんど常にゼロであるため)。ただし、幅スケール係数は、(((double)Value-(double)Minimum)/((double)Maximum-(double)Minimum))である必要があります。:)
ジェシーチザム2014

121

はい、すべての回答とリンクを読むのにしばらく時間がかかりました。ここに私が彼らから得たものがあります:

結果の例

受け入れられた答えは視覚スタイルを無効にします、それはあなたが好きなように色を設定することを可能にしますが、結果は明白に見えます:

ここに画像の説明を入力してください

次の方法を使用すると、代わりに次のようなものが得られます。

ここに画像の説明を入力してください

方法

最初に、次のことを行っていない場合はこれを含めます。 using System.Runtime.InteropServices;

次に、この新しいクラスを作成するか、コードを既存のstatic非ジェネリッククラスに配置します。

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

これを使用するには、次のように呼び出します。

progressBar1.SetState(2);

SetStateの2番目のパラメータ、1 =通常(緑)に注意してください。2 =エラー(赤); 3 =警告(黄色)。

それが役に立てば幸い!


18
拡張メソッドを作成したので、呼び出しはprogressBar1.SetState(2);であ​​る必要があります。それ以外にも、素晴らしい答えです!
エドガーヘルナンデス

5
これはVista +でのみ利用可能であることに注意してください。PBM_SETSTATEを検索すると、完全なドキュメントを表示できます。
Djof 2014年

綺麗な!ありがとう
sapbucket 2015年

1
これはすばらしいですが、進行状況バーが部分的に壊れ、100%になることはありません....
Norbert Boros

1
public const uint PBM_SETSTATE = 0x0410; // 1040
Andrei Krasutski、

37

これは、この質問に対する回答として見つけることができる最も受け入れられているコードのちらつきのないバージョンです。それらの致命的な答えのポスターへのすべての信用。ダスティ、クリス、マット、ジョシュに感謝!

コメントの1つにある「Fueled」のリクエストのように、私はもう少し動作するバージョンも必要でした...専門的に。このコードは、前のコードと同様にスタイルを維持しますが、オフスクリーンイメージレンダーとグラフィックバッファリングを追加します(グラフィックオブジェクトを適切に破棄します)。

結果:すべて良好で、ちらつきはありません。:)

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

まあこれはマイクロソフトからの元の実装に最も近いです。
YakupÜnyılmaz2013年

1
usingブロック使用してDispose 呼び出すことは、実際には少し冗長です。素晴らしい答えです。
Kevin Stricker

1
これは古いことに気づきました。そして、私はこれがほんのわずかであることを認識しています(最小値はほとんど常にゼロであるため)。ただし、幅スケール係数は、(((double)Value-(double)Minimum)/((double)Maximum-(double)Minimum))である必要があります。:)
ジェシーチザム2014

TextRenderer.DrawText()を使用してテキストをオフスクリーンイメージに描画すると、画面上の最終結果はピクセル化されたように見え、まったく同じフォントを使用するラベルとは異なります。これらすべてをオフスクリーンイメージャーなしでe.Graphicsに直接描画すると、正しい結果が得られます...何かアイデアはありますか?
CuriousGeorge

1
ええ、私はスケールなしでブリットしようとしました。すべてのIの必要性はちょうどに内蔵されているので、最後に、私は、WPFに切り替える。
CuriousGeorge

28

デザイナーでは、ForeColorプロパティを任意の色に設定するだけです。赤の場合、事前定義された色があります。

コード(C#)でこれを行うには、次のようにします。

pgs.ForeColor = Color.Red;

編集:ええ、スタイルも連続に設定します。コードでは、このように:

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

別の編集:(または類似のもの)Application.EnableVisualStyles()から読み取る行も削除する必要がありますProgram.cs。アプリケーションの残りの部分に視覚的なスタイルを持たせたいためにこれを実行できない場合は、コントロールを自分でペイントするか、WPFに進むことをお勧めします。所有者がcodeplexにプログレスバー描画するチュートリアルを見つけることができます


3
Forecolor = red; Backcolor = blue; スタイル=継続的。何も変わっていない、私がそれに触れたことがないようにとどまる
Ivan Prodanov

3
ええと...大丈夫、私は問題を見ます。これをプロパティで使用するには、視覚スタイルを無効にする必要があります。おそらく、選択したテーマを使用してペイントしています。Program.csには、Application.EnableVisualStyles()を読み取る行があります。その行を削除すると、これが機能します。それ以外の場合は、コントロールを自分でペイントする必要があります。もう1つのオプションは、WPFを使用することです(可能であれば)。このようなことを非常に簡単に行うことができるためです。
ダスティバーウェル2009

「自分で描く方法」について詳しく教えてください。
Ivan Prodanov

1
これは、進行状況バーを描画する所有者に関するチュートリアルです。プロセスはコメントするには複雑すぎます。codeproject.com/KB/cpp/VistaProgressBar.aspx
dustyburwell

1
これは残念です。Application.EnableVisualStyles()は、このソリューションの重要な部分です。残念ながら、これは他のすべてのスタイルを壊します。
mr.user1065741

16

Matt BlaineとChris Persichettiの回答を使用して、無限に色を選択できるようにしながら、少し見栄えの良いプログレスバーを作成しました(基本的にはMattのソリューションの1行を変更しました)。

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

使用法:

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

結果

好きなグラデーションを使えます!

ダウンロード

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


2
これは古いことに気づきました。そして、私はこれがほんのわずかであることを認識しています(最小値はほとんど常にゼロだからです)。ただし、幅のスケール係数は、(((double)Value-(double)Minimum)/((double)Maximum-(double)Minimum))である必要があります。:)
ジェシー・チザム

あなたの提案で回答を更新しました。
Josh M.

古いことはわかっていますがLinearGradientBrush、recの幅を0として読み取るため、このコードは値4 に達するとエラーになります。最も簡単な修正は、コードで4pxの「パディング」を行わず、代わりに配置することですパネルやパディングで何か(あなたが国境をしたい場合)となっrec.Width = (int)((rec.Width * scaleFactor) - 4)rec.Width = (int)(rec.Width * scaleFactor) + 1
MiDri

14

ダスティバーウェルの答えの修正。(私は自分で編集するのに十分な担当者がいません。)彼の答えのように、「ビジュアルスタイル」を有効にして動作します。プログレスバーのForeColorプロパティは、どのフォームのデザインビューでも設定できます。

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

これは前景色を変更するのに最適ですが、ちらつきが多いのに対し、デフォルトのProgressBarコントロールはそうではありません。これを解決する方法はありますか?
2010

4
ちらつきを解決する方法を見つけました。次のように、ユーザー定義のProgressBarのControlStylesにダブルバッファリングを追加します:SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer、...)。
2010

これは古いことに気づきました。そして、私はこれがほんのわずかであることを認識しています(最小値はほとんど常にゼロだからです)。ただし、幅のスケール係数は、(((double)Value-(double)Minimum)/((double)Maximum-(double)Minimum))である必要があります。:)
ジェシーチザム

5

これを静的クラスに入れるだけです。

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

それが役に立てば幸い、

マーク


+1:これは、ほとんどの人が赤を意味していると思います。エラー状態を表示させます。
クォンタム

3

通常、進行状況バーはテーマが設定されているか、ユーザーの色の設定を反映しています。したがって、色を変更するには、視覚スタイルをオフにして設定する必要がありますForeColor、コントロールを自分でまたは描画するます。

ブロックの代わりに連続スタイルについては、Styleプロパティを設定できます:

pBar.Style = ProgressBarStyle.Continuous;

2

編集

物音によって、緑のブロックベースのプログラムバーがあるXPテーマを使用しています。UIスタイルをWindowsクラシックに切り替えてもう一度テストしてください。ただし、すべてのUIスタイルで必要なことを実行するには、独自のOnPaintイベントを実装する必要がある場合があります。

または、他の誰かが指摘したように、アプリケーションのVisualStylesを無効にします。

元の

私の知る限りでは、プログレスバーのレンダリングは、選択したWindowsテーマスタイル(win2K、xp、vista)とインラインで行われます。

プロパティを設定して色を変更できます

ProgressBar.ForeColor

しかし、あなたがもっともっとできるかどうかはわかりません...

いくつかグーグルを行います

「スムーズ」プログレスバーの作成に関するMS KBの記事があります。

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


@ Eion、Forecolor = red; Backcolor = blue; スタイル=継続的。何も変わっていない、それは私がそれに触れたことがないようなままです。
Ivan Prodanov


2

これらの方法はすべて私にとってはうまくいきませんが、この方法を使用すると、色の文字列に変更できます。

StackOverflowの他の場所からこのコードを見つけて、少し変更したことに注意してください。それ以来、このコードを見つけた場所を忘れてしまい、リンクできないので、申し訳ありません。

しかし、とにかく私はこのコードが本当に私を助けてくれた誰かを助けることを願っています。

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

「ProgressBar」という名前が使用されている場合は、独自のプログレスバー名に置き換えてください。他の引数を使用してこのイベントをトリガーすることもできます。その場合は、その内側の角かっこがどこかにあることを確認してください。


いい仕事です。ProgressChangedイベントの内部を使用して、明るいところから暗いところに行きます... + 1
BENN1TH

2

変化ColorValue(瞬時変化)

置く using System.Runtime.InteropServices; ...

と電話する ColorBar.SetState(progressBar1, ColorBar.Color.Yellow, myValue);

バーの値(大きさ)を変更しても、デフォルトの緑以外の色では変更されないことに気付きました。user1032613のコードを取得し、Valueオプションを追加しました。

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
私たちは、反転しなければならなかったpBar.Value = pBar.Maximum;し、SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);正しい新しい色を表示するプログレスのための条件-体の内部。
DomTheDeveloper 2017年

1

誰かが別のオプションを探している場合に備えて...パネルを拡張し、それを背景(白など)として使用し、その中に別のパネルを前景(移動バー)に追加できます。次に、色を変更するなど、完全に制御できます。


1

Visual Basicソリューションエクスプローラー(vbファイルがある場所)でプロジェクトを右クリックし、メニューからプロパティを選択します。ポップアップウィンドウで[XPビジュアルスタイルを有効にする]の選択を解除すると、前景色を設定したときに機能するようになります。


0

注:引用:通常、進行状況バーはテーマが設定されているか、ユーザーの色設定を反映しています。したがって、色を変更するには、視覚スタイルをオフにして設定する必要がありますForeColor、コントロールを自分でまたは描画するます。

ブロックの代わりに連続スタイルについては、Styleプロパティを設定できます:

pBar.Style = ProgressBarStyle.Continuous;

ProgressBarStyle.ContinuousとBlocksは、VistualStylesが有効になっていると役に立ちません...

ブロックは、視覚スタイルが無効になっている場合にのみ機能します...これにより、(カスタムプログレスカラーに関して)このすべての問題点がレンダリングされます。

ウィリアムダニエルの回答(視覚スタイルが有効になっているため、スタイルがなくてもForeColorがフラットになるだけではありません)とバリーの回答(プログレスバーのカスタムテキストへ)を組み合わせて使用​​しました


0

垂直バーUPダウン用赤色:

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

    } 
}

これにより問題がどのように解決されるかを、テキストまたはコメントでコードに説明していただけますか。
Harrison

私はこれがほんのわずかであることを理解しています(最小値はほとんど常にゼロであるため)。ただし、高さスケール係数は、(((double)Value-(double)Minimum)/((double)Maximum-(double)Minimum))である必要があります。:)
ジェシー・チザム2014

0

WXPビジュアルスタイルの回答を尊重するVB.Net色のプログレスバーは...

3/17/12の「user1032613」からの回答から始めました。これはモジュールではなく、クラスになっていることに注意してください。そこからコードを変換しましたが、さらに必要でした。特に、変換されたコードは、「状態」整数を機能しないIntPtr型に変換するDirectCast関数を示しました。

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

そしてもう一度、これを使用するコードでこれを次の行で呼び出します:

Call ModifyProgressBarColor.SetState(prb, 2)

ところで-私は他の色を試しました-0、4、5-それらはすべて緑色で表示されました。


0

私は今答えられるにはあまりにも古いその方法を知っている..しかし、まだ、@に小さな微調整ダニエル・ゼロ値プログレスバーが表示されないという問題を整流するための答え。内側の長方形の幅がゼロ以外であることが判明した場合にのみ、プログレスを描画してください。

すべての貢献者に感謝します。

        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

これは、進行状況バーの内側に長方形を描画し、進行状況の現在の値に応じて幅を設定することで実行できることがわかりました。右から左への進行のサポートも追加しました。この方法では、Imageを使用する必要はありません。Rectnalge.Inflateは呼び出されないため、描画される四角形は小さくなります。

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

私はすべての最も簡単な解決策だと思います、それはただの簡単な修正ですが、Program.csからApplication.EnableVisualStyles()を削除するかコメントを付けることができますが、Main関数を含む部分に名前を付けることができます。その後、progressBar.ForeColor = Color.TheColorYouDesire;を使用して、プログレスバーの色を自由に変更できます。

static void Main()
        {
            //Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
         }

-5

編集:2つのミニッツで、vsを起動し、構文を確認して、はるかに優れた応答でそれに負けました。私はこのサイトが大好きです。

        progressBar1 = new ProgressBar();
        progressBar1.ForeColor = Color.Red;

2
動作しません。現在は空のままです。progressBar1.value= 50を追加しましたが、まだ空です
Ivan Prodanov

最大値を設定してみましたか?progressBar1 = new ProgressBar(); progressBar1.ForeColor = Color.Red; progressBar1.Maximum = 100;
Fusspawn 2009

2
いいえ、問題は私のWindowsテーマにあります。
Ivan Prodanov

これが機能するかどうかはわかりませんが、Application.EnableVisualThemes();をコメント化してみてください。これは、ビルド済みファイルと生成ファイルのいずれかにあります(何を思い出せないか)
Fusspawn 2009

1
Application.EnableVisualStyles()テーマではなく申し訳ありません
Fusspawn 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.