ツールバーや、ステータスバーは、親フォームのクライアント領域にのっかっています。
このため、ツールバーやステータスバーを表示した状態で、クライアント領域に描画を行うと一部が隠されてしまいます。また、クライアント領域のスクロールにも支障がでます。
そこで、Panelクラスの利用を考えます。Panelクラスは元々は、コントロールのコレクションをグループ化するためのものです。
フォーム上に、ツールバー、ステータスバー、パネルを作ります。これで、フォームのクライアント領域を完全に覆い尽くします。
これには、PanelクラスのDockプロパティをDockStyle.Fillに設定しておきます。 これで、フォームのサイズが変更になっても大丈夫です。
また、PanelクラスのAutoScrollプロパティをtrueにしておくと、自動的にスクロールバーが表示されます。ただし、直接Panelクラスに文字等を表示してはうまくいきません。
これを解消するためには、Panelの上にLabelを貼り付けます。
LabelクラスのAutoSizeプロパティをtrueにしておくと、サイズが自動調整されます。
LabelのTextプロパティに表示したい文字列を指定します。
さて、この章で作るプログラムを先に見ておきます。
メニュー、ツールバー、ステータスバーを持っています。
ステータスバーには、現在時刻が表示されています。 メニューから、何も選択されていないと「待機中」と表示されます。
メニュー項目が選択されると、その説明がステータスバーに表示されます。
メニュー項目が実行されたり、ボタンを押したりすると、その内容が表示されます。
表示しきれないときは、スクロールバーが出現します。
ツールバー・ボタンにマウスをポイントすると、ツールチップが出ます。
ツールバーボタンは、フラットにしたり、文字を右に表示したりできます。
では、プログラムを見てみましょう。
// toolbar03.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class toolbar03 : Form
{
    MenuItem miFile, miEnd, miEdit, miView, miSearch, miOpen, miCut, miDelete,
        miHelp, miFlat, miNormal, miRight, miUnder;
    ToolBar tb;
    ToolBarButton tbbOpen, tbbCut, tbbDelete, tbbSearch, tbbHelp;
    StatusBar sb;
    StatusBarPanel sbp0, sbp1, sbp2;
    Panel pnl;
    String str = "";
    Font font;
    Label label;
    public static void Main()
    {
        Application.Run(new toolbar03());
    }
    public toolbar03()
    {
        Text = "猫でもわかるC#プログラミング";
        BackColor = SystemColors.Window;
        MakeMenu();
        MakePanel();
        MakeToolbar();
        MakeStatusbar();
        Timer timer = new Timer();
        timer.Interval = 500;
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
        miNormal.Enabled = false;
        miUnder.Enabled = false;
    }
    void timer_Tick(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        String strtime = String.Format("{0:00}:{1:00}:{2:00}", dt.Hour, dt.Minute, dt.Second);
        sbp2.Text = strtime;
    }
    void MakeMenu()
    {
        MainMenu mm = new MainMenu();
        Menu = mm;
        miFile = new MenuItem();
        miFile.Text = "ファイル(&F)";
        mm.MenuItems.Add(miFile);
        miOpen = new MenuItem();
        miOpen.Text = "開く(&O)";
        miOpen.Click += new EventHandler(miOpen_Click);
        miOpen.Select += new EventHandler(miOpen_Select);
        miFile.MenuItems.Add(miOpen);
        miEnd = new MenuItem();
        miEnd.Text = "終了(&X)";
        miEnd.Click += new EventHandler(miEnd_Click);
        miEnd.Select += new EventHandler(miEnd_Select);
        miFile.MenuItems.Add(miEnd);
        miEdit = new MenuItem();
        miEdit.Text = "編集(&E)";
        mm.MenuItems.Add(miEdit);
        miCut = new MenuItem();
        miCut.Text = "切り取り(&T)";
        miCut.Click += new EventHandler(miCut_Click);
        miCut.Select += new EventHandler(miCut_Select);
        miEdit.MenuItems.Add(miCut);
        miDelete = new MenuItem();
        miDelete.Text = "削除(&D)";
        miDelete.Click += new EventHandler(miDelete_Click);
        miDelete.Select += new EventHandler(miDelete_Select);
        miEdit.MenuItems.Add(miDelete);
        miSearch = new MenuItem();
        miSearch.Text = "検索(&F)";
        miSearch.Click += new EventHandler(miSearch_Click);
        miSearch.Select += new EventHandler(miSearch_Select);
        miEdit.MenuItems.Add(miSearch);
        miView = new MenuItem();
        miView.Text = "表示(&V)";
        mm.MenuItems.Add(miView);
        miFlat = new MenuItem();
        miFlat.Text = "フラット";
        miFlat.Click += new EventHandler(miFlat_Click);
        miFlat.Select += new EventHandler(miFlat_Select);
        miView.MenuItems.Add(miFlat);
        miNormal = new MenuItem();
        miNormal.Text = "従来型";
        miNormal.Click += new EventHandler(miNormal_Click);
        miNormal.Select += new EventHandler(miNormal_Select);
        miView.MenuItems.Add(miNormal);
        miRight = new MenuItem();
        miRight.Text = "文字の右側表示";
        miRight.Click += new EventHandler(miRight_Click);
        miRight.Select += new EventHandler(miRight_Select);
        miView.MenuItems.Add(miRight);
        miUnder = new MenuItem();
        miUnder.Text = "文字の下方表示";
        miUnder.Click += new EventHandler(miUnder_Click);
        miUnder.Select += new EventHandler(miUnder_Select);
        miView.MenuItems.Add(miUnder);
        miHelp = new MenuItem();
        miHelp.Text = "ヘルプ";
        miHelp.Click += new EventHandler(miHelp_Click);
        mm.MenuItems.Add(miHelp);
    }
    void MakePanel()
    {
        pnl = new Panel();
        pnl.Parent = this;
        pnl.BackColor = Color.Yellow;
        pnl.Dock = DockStyle.Fill;
        pnl.AutoScroll = true;
        pnl.BorderStyle = BorderStyle.Fixed3D;
        font = new Font("MS ゴシック", 20);
        label = new Label();
        label.Parent = pnl;
        label.AutoSize = true;
        label.Font = font;
    }
    void MakeToolbar()
    {
        tb = new ToolBar();
        tb.Parent = this;
        ImageList iList = new ImageList();
        Bitmap btm = new Bitmap(GetType(), "toolbar03.tool03.bmp");
        iList.Images.AddStrip(btm);
        iList.TransparentColor = Color.Red;
        tb.ImageList = iList;
        tb.ShowToolTips = true;
        tb.ButtonClick += new ToolBarButtonClickEventHandler(tb_ButtonClick);
        tbbOpen = new ToolBarButton();
        tbbOpen.Text = "開く";
        tbbOpen.ToolTipText = "ファイルを開きます";
        tbbOpen.Tag = miOpen;
        tbbOpen.ImageIndex = 0;
        tb.Buttons.Add(tbbOpen);
        tbbCut = new ToolBarButton();
        tbbCut.Text = "切り取り";
        tbbCut.ToolTipText = "切り取ります";
        tbbCut.Tag = miCut;
        tbbCut.ImageIndex = 1;
        tb.Buttons.Add(tbbCut);
        tbbDelete = new ToolBarButton();
        tbbDelete.Text = "削除";
        tbbDelete.ToolTipText = "削除します";
        tbbDelete.Tag = miDelete;
        tbbDelete.ImageIndex = 2;
        tb.Buttons.Add(tbbDelete);
        tbbSearch = new ToolBarButton();
        tbbSearch.Text = "検索";
        tbbSearch.ToolTipText = "検索します";
        tbbSearch.Tag = miSearch;
        tbbSearch.ImageIndex = 3;
        tb.Buttons.Add(tbbSearch);
        tbbHelp = new ToolBarButton();
        tbbHelp.Text = "ヘルプ";
        tbbHelp.ToolTipText = "ヘルプを表示します";
        tbbHelp.Tag = miHelp;
        tbbHelp.ImageIndex = 4;
        tb.Buttons.Add(tbbHelp);
    }
    void MakeStatusbar()
    {
        sb = new StatusBar();
        sb.Parent = this;
        sb.ShowPanels = true;
        sbp0 = new StatusBarPanel();
        sbp0.AutoSize = StatusBarPanelAutoSize.Contents;
        sb.Panels.Add(sbp0);
        sbp0.Text = "待機中...";
        sbp1 = new StatusBarPanel();
        sbp1.AutoSize = StatusBarPanelAutoSize.Spring;
        sb.Panels.Add(sbp1);
        sbp2 = new StatusBarPanel();
        sbp2.AutoSize = StatusBarPanelAutoSize.Contents;
        sb.Panels.Add(sbp2);
    }
    void miOpen_Select(object sender, EventArgs e)
    {
        sbp0.Text = "ファイルを開きます";
    }
    void miEnd_Select(object sender, EventArgs e)
    {
        sbp0.Text = "このプログラムを終了します";
    }
    void miCut_Select(object sender, EventArgs e)
    {
        sbp0.Text = "切り取ります";
    }
    void miDelete_Select(object sender, EventArgs e)
    {
        sbp0.Text = "削除します";
    }
    void miSearch_Select(object sender, EventArgs e)
    {
        sbp0.Text = "検索します";
    }
    void miFlat_Select(object sender, EventArgs e)
    {
        sbp0.Text = "ツールバーボタンをフラットにします";
    }
    void miNormal_Select(object sender, EventArgs e)
    {
        sbp0.Text = "ツールバーボタンを従来型にします";
    }
    void miRight_Select(object sender, EventArgs e)
    {
        sbp0.Text = "ボタンの文字を右側に表示します";
    }
    void miUnder_Select(object sender, EventArgs e)
    {
        sbp0.Text = "ボタンの文字を下方に表示します";
    }
    void miOpen_Click(object sender, EventArgs e)
    {
        str += "開くが選択されました\n";
        label.Text = str;
    }
    void miEnd_Click(object sender, EventArgs e)
    {
        Close();
    }
    void miCut_Click(object sender, EventArgs e)
    {
        str += "切り取りが選択されました\n";
        label.Text = str;
    }
    void miDelete_Click(object sender, EventArgs e)
    {
        str += "削除が選択されました\n";
        label.Text = str;
    }
    void miSearch_Click(object sender, EventArgs e)
    {
        str += "検索が選択されました\n";
        label.Text = str;
    }
    void miFlat_Click(object sender, EventArgs e)
    {
        tb.Appearance = ToolBarAppearance.Flat;
        miFlat.Enabled = false;
        miNormal.Enabled = true;
    }
    void miNormal_Click(object sender, EventArgs e)
    {
        tb.Appearance = ToolBarAppearance.Normal;
        miFlat.Enabled = true;
        miNormal.Enabled = false;
    }
    void miRight_Click(object sender, EventArgs e)
    {
        tb.TextAlign = ToolBarTextAlign.Right;
        miUnder.Enabled = true;
        miRight.Enabled = false;
    }
    void miUnder_Click(object sender, EventArgs e)
    {
        tb.TextAlign = ToolBarTextAlign.Underneath;
        miUnder.Enabled = false;
        miRight.Enabled = true;
    }
    void miHelp_Click(object sender, EventArgs e)
    {
        str += "ヘルプが選択されました\n";
        label.Text = str;
    }
    void tb_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
    {
        ToolBarButton tbb = e.Button;
        MenuItem mi = (MenuItem)tbb.Tag;
        mi.PerformClick();
    }
    protected override void OnMenuComplete(EventArgs e)
    {
        base.OnMenuComplete(e);
        sbp0.Text = "準備中...";
    }
}
さて、黄色く見えているのは、PanelのBackColorです。Labelはどういう状態になっているのか知りたいときは、LabelのBackColorを別な色に指定するとよくわかります。
これは、LabelのBackColorを青にしてみました。
ちょっと長いですが、順番に見ていくと、どうということもありませんね。
Update 31/May/2007 By Y.Kumei