DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ToolStripContainerの代わりにToolStripPanelを使って、MDIに移動可能なToolStripを付ける

注意:ここで紹介している方法は、.NET Framework 2.0以降でのみ使用できます。

ToolStripとToolStripContainerを使って、ツールバーの位置をユーザーが変更できるようにする」で説明したように、ToolStripContainerコントロールを使えば、ToolStripコントロールをユーザーが上下左右の好きな位置に移動させることができるようになります。

実はToolStripContainerコントロールは、上下左右に1つずつ(計4つ)のToolStripPanelコントロールを持ち、さらに中央に1つのToolStripContentPanelコントロールを持っています。ToolStripがToolStripContainerの自由な位置に移動できるのは、実はこのToolStripPanelコントロールのおかげです。ですので、例えばフォームの上部だけにToolStripを配置したい場合は、わざわざToolStripContainerを使わなくても、1つのToolStripPanelをフォームの上部に配置するだけで十分です。

MDIの親フォームでは、DockプロパティをFillにしてToolStripContainerを使うことができません。なぜなら、ToolStripContainerの真ん中はToolStripContentPanelのため、子フォームを表示する場所がなくなってしまうのです。よってMDI親フォームでは、ToolStripContainerではなく、ToolStripPanelを使用します。

ToolStripPanelコントロールは、デフォルトでは、Visual Studioのツールボックスにありません。ツールボックスにToolStripPanelを表示するには、ツールボックスで右クリックしてコンテキストメニューを表示し、「アイテムの選択」を選択し、「ToolStripPanel」にチェックをつけて、OKをクリックします。

ツールボックスアイテムの選択ダイアログ

もちろんフォームデザイナを使用せずに、「コントロールを実行時に作成する」のように自分でコードを書くことによってもToolStripPanelをフォームに配置することができます。

以下にフォームの上部にToolStripPanelを1つだけ配置した例を示します。このコードは、フォームクラス内に書かれているものとします。

VB.NET
コードを隠すコードを選択
Private topToolStripPanel As ToolStripPanel
Private toolStrip1 As ToolStrip
Private toolStripButton1 As ToolStripButton

'フォームのLoadイベントハンドラ
Private Sub Form1_Load(sender As Object, e As EventArgs) _
    Handles MyBase.Load

    'ToolStripPanelオブジェクトを作成
    topToolStripPanel = New ToolStripPanel()

    'レイアウトを停止
    Me.SuspendLayout()
    topToolStripPanel.SuspendLayout()

    '水平方向にToolStripを並べるようにする
    topToolStripPanel.Orientation = Orientation.Horizontal
    '上部に配置する
    topToolStripPanel.Dock = DockStyle.Top

    'ToolStripの作成
    toolStrip1 = New ToolStrip()
    toolStrip1.SuspendLayout()
    'ToolStripButtonオブジェクトを作成
    toolStripButton1 = New ToolStripButton()
    toolStripButton1.Text = "保存"
    AddHandler toolStripButton1.Click, AddressOf toolStripButton1_Click
    'ToolStripにアイテムを追加
    toolStrip1.Items.Add(toolStripButton1)

    'topToolStripPanelにtoolStrip1を追加
    topToolStripPanel.Join(toolStrip1)
    'または、
    'topToolStripPanel.Controls.Add(toolStrip1)

    'フォームにtoolStripContainer1を追加
    Me.Controls.Add(topToolStripPanel)

    'レイアウトを再開
    topToolStripPanel.ResumeLayout(False)
    topToolStripPanel.PerformLayout()
    toolStrip1.ResumeLayout(False)
    toolStrip1.PerformLayout()
    Me.ResumeLayout(False)
    Me.PerformLayout()
End Sub

Private Sub toolStripButton1_Click(sender As Object, e As EventArgs)
    MessageBox.Show("toolStripButton1が押されました")
End Sub
C#
コードを隠すコードを選択
private ToolStripPanel topToolStripPanel;
private ToolStrip toolStrip1;
private ToolStripButton toolStripButton1;

//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
    //ToolStripPanelオブジェクトを作成
    topToolStripPanel = new ToolStripPanel();

    //レイアウトを停止
    this.SuspendLayout();
    topToolStripPanel.SuspendLayout();

    //水平方向にToolStripを並べるようにする
    topToolStripPanel.Orientation = Orientation.Horizontal;
    //上部に配置する
    topToolStripPanel.Dock = DockStyle.Top;

    //ToolStripの作成
    toolStrip1 = new ToolStrip();
    toolStrip1.SuspendLayout();
    //ToolStripButtonオブジェクトを作成
    toolStripButton1 = new ToolStripButton();
    toolStripButton1.Text = "保存";
    toolStripButton1.Click += new EventHandler(toolStripButton1_Click);
    //ToolStripにアイテムを追加
    toolStrip1.Items.Add(toolStripButton1);

    //topToolStripPanelにtoolStrip1を追加
    topToolStripPanel.Join(toolStrip1);
    //または、
    //topToolStripPanel.Controls.Add(toolStrip1);

    //フォームにtoolStripContainer1を追加
    this.Controls.Add(topToolStripPanel);

    //レイアウトを再開
    topToolStripPanel.ResumeLayout(false);
    topToolStripPanel.PerformLayout();
    toolStrip1.ResumeLayout(false);
    toolStrip1.PerformLayout();
    this.ResumeLayout(false);
    this.PerformLayout();
}

private void toolStripButton1_Click(object sender, EventArgs e)
{
    MessageBox.Show("toolStripButton1が押されました");
}
  • 履歴:
  • 2012/02/08 タイトルを変更。
  • 2014/9/8 コードを少し書き換えた。
  • 2014/9/25 画像を追加。レイアウトロジックを再開するコードをフォームデザイナが生成するコードを参考にして書き直した。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。