第54章 パネルの幅を調節する


ステータスバーにステータスバー・パネルをつけたとき、ステータスバーの幅が変わった場合、これに対応できるようにしておく必要があります。



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メソッドを使って、ステータスバーにパネルをつけます。

では、実行結果を見てみましょう。

メインウィンドウの大きさを変えると・・・



真ん中の、ステータスバー・パネルの幅も変更され、ちょうど良い幅に調整してくれます。




[C# フォーム Index] [C# コンソール Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 05/Feb/2007 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。