.NET Framework 2.0から追加されたStatusStripコントロールでは、非常に簡単です。ToolStripProgressBarをStatusStripに追加するだけです。
具体的な手順は次の通りです。
StatusBarコントロールにProgressBarを追加する方法としては、「StatusBarにコントロールを追加する」で紹介したようにStatusBarにProgressBarコントロールを追加する方法がありますが、これとは別に、StatusBarのPanelをオーナードローすることにより、ProgressBarを表示する方法もあります。
この方法に関しては、「DOTNET Archives - Re: Progress bar + status bar」で説明されています。また、VB.NETのクラスとしては、「Edneeis - Control - MDI Progressbar StatusBar Panel」が優れているようです。
ここではこれらを参考に、その基本的な考え方が分かる程度の、ごく簡単なサンプルを示します。まずは次のようなStatusBarPanelクラスの派生クラスを作成します。
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
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イベントハンドラや、コンストラクタなどに記述してください。
'パネルを表示する StatusBar1.ShowPanels = True 'ProgressStatusBarPanelの作成 Dim psbp As New ProgressStatusBarPanel(StatusBar1) 'プロパティを変更する psbp.Value = 70 'StatusBar1のパネルに追加する StatusBar1.Panels.Add(psbp)
//パネルを表示する StatusBar1.ShowPanels = true; //ProgressStatusBarPanelの作成 ProgressStatusBarPanel psbp = new ProgressStatusBarPanel(StatusBar1); //プロパティを変更する psbp.Value = 70; //StatusBar1のパネルに追加する StatusBar1.Panels.Add(psbp);