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

ステータスバーにProgressBarを追加する

StatusStripコントロールの場合

.NET Framework 2.0から追加されたStatusStripコントロールでは、非常に簡単です。ToolStripProgressBarをStatusStripに追加するだけです。

具体的な手順は次の通りです。

  1. ツールボックスの「メニューとツールバー」にある「StatusStrip」をフォームにドラッグ&ドロップします。
    StatusStrip
  2. StatusStripコントロールの下矢印をクリックしてメニューを表示し、「ProgressBar」を選択します。
    ToolStripProgressBar
  3. 以上です。ToolStripProgressBarのMaximumプロパティで最大値、Minimumプロパティで最小値、Valueプロパティで現在の値を設定できます。

StatusBarコントロールの場合

StatusBarコントロールにProgressBarを追加する方法としては、「StatusBarにコントロールを追加する」で紹介したようにStatusBarにProgressBarコントロールを追加する方法がありますが、これとは別に、StatusBarのPanelをオーナードローすることにより、ProgressBarを表示する方法もあります。

この方法に関しては、「DOTNET Archives - Re: Progress bar + status bar」で説明されています。また、VB.NETのクラスとしては、「Edneeis - Control - MDI Progressbar StatusBar Panel」が優れているようです。

ここではこれらを参考に、その基本的な考え方が分かる程度の、ごく簡単なサンプルを示します。まずは次のようなStatusBarPanelクラスの派生クラスを作成します。

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

''' <summary>
''' StatusBarのPanelにProgressBarを表示する
''' </summary>
Public Class ProgressStatusBarPanel
    Inherits StatusBarPanel
    '最小値
    Public Minimum As Integer
    '最大値
    Public Maximum As Integer
    '現在の値
    Private _value As Integer

    Public Property Value() As Integer
        Get
            Return _value
        End Get
        Set(ByVal Value As Integer)
            _value = Value
            If Not (Me.Parent Is Nothing) Then
                'StatusBarを再描画する
                Me.Parent.Refresh()
            End If
        End Set
    End Property

    'バーの色
    Private _foreColor As Color
    Public Property ForeColor() As Color
        Get
            Return _foreColor
        End Get
        Set(ByVal Value As Color)
            _foreColor = Value
            If Not (Me.Parent Is Nothing) Then
                'StatusBarを再描画する
                Me.Parent.Refresh()
            End If
        End Set
    End Property

    Public Sub New(ByVal sb As StatusBar)
        'オーナードローを指定する
        Me.Style = StatusBarPanelStyle.OwnerDraw
        '初期値の設定
        Me.ForeColor = SystemColors.Highlight
        Me.Minimum = 1
        Me.Maximum = 100
        Me.Value = 0

        'StatusBarのDrawItemイベントハンドラの追加
        AddHandler sb.DrawItem, AddressOf sb_DrawItem
    End Sub

    Private Sub sb_DrawItem(ByVal sender As Object, _
            ByVal sbdevent As StatusBarDrawItemEventArgs)
        '描画するパネルが自分自身か確かめる
        If sbdevent.Panel.Equals(Me) Then
            '(値のチェックは一切行っていない)
            'バーを描画する
            Dim barWidth As Integer = _
                CInt(CDbl(Value) * CDbl(sbdevent.Bounds.Width) / _
                CDbl(Maximum - Minimum))
            Dim br = New SolidBrush(ForeColor)
            sbdevent.Graphics.FillRectangle(br, _
                sbdevent.Bounds.X, sbdevent.Bounds.Y, _
                barWidth, sbdevent.Bounds.Height)
            br.Dispose()
        End If
    End Sub
End Class
C#
コードを隠すコードを選択
using System;
using System.Drawing;
using System.Windows.Forms;

/// <summary>
/// StatusBarのPanelにProgressBarを表示する
/// </summary>
public class ProgressStatusBarPanel : StatusBarPanel
{
    //最小値
    public int Minimum;
    //最大値
    public int Maximum;
    //現在の値
    private int _value;
    public int Value
    {
        set
        {
            _value = value;
            //StatusBarを再描画する
            if (this.Parent != null)
            {
                this.Parent.Refresh();
            }
        }
        get { return _value; }
    }
    //バーの色
    private Color _foreColor;
    public Color ForeColor
    {
        set
        {
            _foreColor = value;
            //StatusBarを再描画する
            if (this.Parent != null)
            {
                this.Parent.Refresh();
            }
        }
        get { return _foreColor; }
    }

    public ProgressStatusBarPanel(StatusBar sb)
    {
        //オーナードローを指定する
        this.Style = StatusBarPanelStyle.OwnerDraw;
        //初期値の設定
        this.ForeColor = SystemColors.Highlight;
        this.Minimum = 1;
        this.Maximum = 100;
        this.Value = 0;

        //StatusBarのDrawItemイベントハンドラの追加
        sb.DrawItem +=
            new StatusBarDrawItemEventHandler(sb_DrawItem);
    }

    private void sb_DrawItem(object sender,
        StatusBarDrawItemEventArgs sbdevent)
    {
        //描画するパネルが自分自身か確かめる
        if (sbdevent.Panel == this)
        {
            //(値のチェックは一切行っていない)
            //バーを描画する
            int barWidth =
                (int) ((double) Value * 
                    (double) sbdevent.Bounds.Width /
                    (double) (Maximum - Minimum));
            Brush br = new SolidBrush(ForeColor);
            sbdevent.Graphics.FillRectangle(br,
                sbdevent.Bounds.X, sbdevent.Bounds.Y,
                barWidth, sbdevent.Bounds.Height);
            br.Dispose();
        }
    }
}

使用法は、例えば次のようになります。ここでは、フォームにステータスバーStatusBar1があり、これにProgressStatusBarPanelを追加します。このコードは、フォームのLoadイベントハンドラや、コンストラクタなどに記述してください。

VB.NET
コードを隠すコードを選択
'パネルを表示する
StatusBar1.ShowPanels = True

'ProgressStatusBarPanelの作成
Dim psbp As New ProgressStatusBarPanel(StatusBar1)
'プロパティを変更する
psbp.Value = 70
'StatusBar1のパネルに追加する
StatusBar1.Panels.Add(psbp)
C#
コードを隠すコードを選択
//パネルを表示する
StatusBar1.ShowPanels = true;

//ProgressStatusBarPanelの作成
ProgressStatusBarPanel psbp =
    new ProgressStatusBarPanel(StatusBar1);
//プロパティを変更する
psbp.Value = 70;
//StatusBar1のパネルに追加する
StatusBar1.Panels.Add(psbp);
  • 履歴:
  • 2009/7/7 「StatusStripコントロールの場合」の具体的な手順を追加。

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

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。