ステータスバーにステータスバー・パネルをつけたとき、ステータスバーの幅が変わった場合、これに対応できるようにしておく必要があります。
C#の場合、StatusBarPanelクラスのAutoSizeプロパティをStatusBarPanelAutoSize.Springに設定すると、幅を調整してくれます。これは、すでに第53章で解説しています。
さて、この章では3つのステータスバー・パネルを持つステータスバーを作ります。 最初のパネルには日付を、3番目のパネルには時刻を表示します。
ステータスバーの幅が変わった場合、2番目のパネルが調整役をします。
刻々と時刻を表示させるにはどうしたらよいでしょうか。これは、Timerクラスを利用します。
Timerクラスの、Statrメソッドを実行すると、指定された間隔でTickイベントが発生します。このイベントを捕らえて、時刻をパネルに表示すればよいですね。
また、Tickイベントの発生間隔はTimerクラスのIntervalプロパティで設定します。
なお、Timerクラスについては後の章で詳しく解説するので、ここでは詳述しません。
では、サンプルのプログラムを見てみましょう。
// status03.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class status03
{
public static void Main()
{
Application.Run(new MyForm());
}
}
class MyForm : Form
{
MyStatus ms;
public MyForm()
{
Text = "猫でもわかるC#プログラミング";
BackColor = SystemColors.Window;
ms = new MyStatus();
ms.Parent = this;
ms.ShowPanels = true;
Timer timer = new Timer();
timer.Interval = 50;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
String str = dt.ToShortDateString();
ms.Panels[0].Text = str;
str = String.Format("{0:00}:{1:00}:{2:00}", dt.Hour, dt.Minute, dt.Second);
ms.Panels[2].Text = str;
}
}
class MyStatus : StatusBar
{
public MyStatus()
{
StatusBarPanel sbp0 = new StatusBarPanel();
StatusBarPanel sbp1 = new StatusBarPanel();
StatusBarPanel sbp2 = new StatusBarPanel();
sbp0.AutoSize = StatusBarPanelAutoSize.Contents;
sbp0.Alignment = HorizontalAlignment.Center;
sbp0.ToolTipText = "日付です";
sbp1.AutoSize = StatusBarPanelAutoSize.Spring;
sbp2.AutoSize = StatusBarPanelAutoSize.Contents;
sbp2.Alignment = HorizontalAlignment.Center;
sbp2.ToolTipText = "時刻です";
Panels.Add(sbp0);
Panels.Add(sbp1);
Panels.Add(sbp2);
}
}
このプログラムでは、Mainメソッドのあるクラスは、Formクラスを継承していません。MyFormクラスは、Formクラスから継承されています。
MyStatusクラスのインスタンスをフィールドに持っています。
コンストラクタでは、メインフォームのタイトルやら、クライアント領域の背景色を設定しています。
そして、MyStatusクラスのインスタンスの参照をmsフィールドに代入しています。これで、このクラスの中では、どこからでもステータスバーを参照できるようになりました。
次に、Timerを作動させています。Intervalは50ミリセコンドにしています。
timer.Tick += new EventHandler(timer_Tick);で、Tickイベントに対する、イベントハンドラをインストールしています。
Tickイベントが生成されたら、timer_Tickハンドラが呼び出されます。
ハンドラ内では、現在の日時を調べて、ステータスバー・パネルに表示しています。
DateTime構造体については、C#コンソール編第52章を参照してください。
ここでは、日付の短い表示を得るためにToShortDateStringメソッドを利用しています。 時間についてもToShortTimeStringメソッドというのがありますが、秒は表示されないため、ここでは、あえてString.Formatメソッドで、時刻のStringを作っています。
MyStatusクラスは、StatusBarクラスから継承されています。
コンストラクタでは、ステータスバー・パネルを3つ(sbp0,sbp1,sbp2)作ってます。
sbp0のAutoSizeプロパティは、Contentsに設定しました。これで、このパネルに表示される内容に応じて、パネル幅が自動で調整されます。
また、sbp0のAlignmentプロパティは、Centerに設定しました。これで、表示される内容がパネルの中央にきます。
また、ToolTipTextプロパティを設定すると、マウスをパネルにポイントした時、ツールチップがでます。簡単ですね。
sbp1のAutoSizeプロパティはSpringに設定しました。これで、ステータスバーの幅が変更になったときに自動調整してくれます。
sbp2の設定は、ツールチップの文字列を除いて、sbp0と同じです。
あとは、ステータスバーのPanelsコレクションのAddメソッドを使って、ステータスバーにパネルをつけます。
では、実行結果を見てみましょう。
メインウィンドウの大きさを変えると・・・
真ん中の、ステータスバー・パネルの幅も変更され、ちょうど良い幅に調整してくれます。
Update 05/Feb/2007 By Y.Kumei