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