DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ProgressBarが徐々に伸びるアニメーションを無効にする

Windows Vista以降では、ProgressBarの値を変更してもすぐにはバーの長さが変わらず、1テンポ遅れてバーが徐々に伸びていきます(下図)。このような動作は時として邪魔です。ここでは、ProgressBarの値を変更すると、すぐにバーの長さがその値になるようにする方法を紹介します。

徐々に伸びるProgressBar

値を増やしてから減らす方法

これは、「winforms - Disabling .NET progressbar animation when changing value? - Stack Overflow」などで紹介されている方法です。

ProgressBarコントロールでは、Valueプロパティの値を増やした時はバーが徐々に伸びますが、減らした時はすぐにその長さになります。これを利用して、Valueプロパティの値を設定したい値より大きな値にしてから、すぐに本来設定したい値にすることで、バーをすぐに伸ばすことができます。

Valueプロパティを最大値(Maximumプロパティと同じ値)にする時は、Maximumプロパティを増やしてからValueプロパティを増やして、元に戻します。

以下に示すメソッドを使用してプログレスバーの値を設定すると、バーが徐々に伸びることなく、すぐにその長さになります。

VB.NET
コードを隠すコードを選択
'Imports System.Windows.Forms

''' <summary>
''' バーが徐々に伸びるアニメーションを無効にして、
''' ProgressBarのValueに値を設定する。
''' </summary>
''' <param name="pb">値を設定するProgressBar</param>
''' <param name="val">設定する値</param>
Public Shared Sub SetProgressBarValue(pb As ProgressBar, val As Integer)
    If pb.Value < val Then
        '値を増やす時
        If val < pb.Maximum Then
            '目的の値より一つ大きくしてから、目的の値にする
            pb.Value = val + 1
            pb.Value = val
        Else
            '最大値にする時
            '最大値を1つ増やしてから、元に戻す
            pb.Maximum += 1
            pb.Value = val + 1
            pb.Value = val
            pb.Maximum -= 1
        End If
    Else
        '値を減らす時は、そのまま
        pb.Value = val
    End If
End Sub
C#
コードを隠すコードを選択
//using System.Windows.Forms;

/// <summary>
/// バーが徐々に伸びるアニメーションを無効にして、
/// ProgressBarのValueに値を設定する。
/// </summary>
/// <param name="pb">値を設定するProgressBar</param>
/// <param name="val">設定する値</param>
public static void SetProgressBarValue(ProgressBar pb, int val)
{
    if (pb.Value < val)
    {
        //値を増やす時
        if (val < pb.Maximum)
        {
            //目的の値より一つ大きくしてから、目的の値にする
            pb.Value = val + 1;
            pb.Value = val;
        }
        else
        {
            //最大値にする時
            //最大値を1つ増やしてから、元に戻す
            pb.Maximum++;
            pb.Value = val + 1;
            pb.Value = val;
            pb.Maximum--;
        }
    }
    else
    {
        //値を減らす時は、そのまま
        pb.Value = val;
    }
}

ProgressBarの状態をErrorやPausedにする方法

ProgressBarの色を変える」で紹介しているようにProgressBarの状態をErrorやPausedにすると、バーがすぐに伸びるようになります。また、バーが光るようなアニメーション効果もなくなります。ただし色は黄色や赤になります。詳しくはリンク先のページをご覧ください。

自分で描画する方法

同じく「ProgressBarの色を変える」で紹介している自分で描画する方法でも、この問題を解決できます。詳しくはリンク先のページをご覧ください。

  • 履歴:
  • 2014/5/12 「val < pb.Maximum」とすべきところが逆になっていたのを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。