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

ツールバーにコントロールを追加する

ToolStripコントロールの場合

ToolStripコントロールに任意のコントロールを追加する方法は、「ToolStrip(ツールバー、メニュー、ステータスバー)に任意のコントロールを配置する」で紹介しています。

ToolBarコントロールの場合

.NET FrameworkのSystem.Windows.Forms.ToolBarにコンボボックスなどのコントロールを追加し、表示する方法は、残念ながら全く用意されていないようです(Placeholderがありません)。ということは、何とかごまかす方法を考えるしかないでしょう。

ツールバーにコンボボックスを表示される方法として、「C# Coner - How to create a "ComboBox button" in a toolbar in .NET」という記事がありますが、これはコンボボックスの代わりにDropDownButtonを使うというものです。

これ以外に、Separatorをいくつも追加し、Placeholderの代わりにする方法、ToolBarButtonの幅をSendMessageで変更し、Placeholderの代わりにする方法(Newsgroups:microsoft.public.dotnet.framework.windowsforms.controls - Re: ComboBox in a ToolBar? Any experts?)、コンテナにツールバーとコンボボックスを追加し、そのコンテナを一番上に表示させる方法(Newsgroups:microsoft.public.dotnet.framework.windowsforms.controls - Subject:RE: Ideas on how to host Combo Boxes etc on toolbar?)、PanelにButtonコントロールを並べてツールバーの代わりにする方法などがあるようです。

また、System.Windows.Forms.ToolBarの使用はあきらめて、こちらで紹介しているようなツールバーを使用する方法も考えられます。

ここでは、Separatorをいくつも追加し、Placeholderの代わりにする方法を使ってサンプル(メソッド)を書いてみます。Separatorを追加し、そのままコントロールをのせてしまうと、Separatorの線が見えてしまうかもしれませんので、Panelで覆い隠し、このPanelにコントロールをのせることにします。このサンプルでは、ただPanelとコントロールを配置しているだけですので、コントロールの位置を変える必要がある状況になっても、何もしないことに注意してください。(ツールバーの折り返しも許可していません。)

Toolbarにコントロールを載せる

VB.NET
コードを隠すコードを選択
''' <summary>
''' ツールバーにコントロールを追加する
''' </summary>
''' <param name="ctr">追加するコントロール</param>
''' <param name="tbar">ツールバー</param>
Public Shared Sub AddControlInToolbar( _
        ByVal ctr As Control, ByVal tbar As ToolBar)
    Dim sepLeft As Integer = 0
    Dim sepTop As Integer = 0
    Dim sepRight As Integer = 0
    Dim sepBottom As Integer = 0
    'ツールバーの折り返しを禁止する
    '折り返しを許可する時は、toolbarのResizeイベントで
    'Panelの位置を変更する必要がある
    tbar.Wrappable = False

    Dim first As Boolean = True
    Do
        'セパレータを追加する
        Dim sep As New ToolBarButton
        sep.Style = ToolBarButtonStyle.Separator
        tbar.Buttons.Add(sep)
        '左端の座標を記憶
        If first Then
            sepLeft = sep.Rectangle.Left
            sepTop = sep.Rectangle.Top
            first = False
        End If
        '右下の座標を取得
        sepRight = sep.Rectangle.Right
        sepBottom = sep.Rectangle.Bottom
        'コントロールの幅より小さい時は、さらにセパレータを追加
    Loop While sepRight - sepLeft + 1 < ctr.Width

    'ツールバーにパネルを追加し、大きさを合わせる
    Dim pnl As New Panel
    tbar.Controls.Add(pnl)
    pnl.SetBounds(sepLeft, sepTop, _
        sepRight - sepLeft + 1, sepBottom - sepTop + 1)
    pnl.BringToFront()

    'パネルにコントロールを追加する
    pnl.Controls.Add(ctr)
    ctr.Dock = DockStyle.Fill
End Sub
C#
コードを隠すコードを選択
/// <summary>
/// ツールバーにコントロールを追加する
/// </summary>
/// <param name="ctr">追加するコントロール</param>
/// <param name="tbar">ツールバー</param>
public static void AddControlInToolbar(Control ctr, ToolBar tbar)
{
    int sepLeft = 0, sepTop = 0, sepRight = 0, sepBottom = 0;
    //ツールバーの折り返しを禁止する
    //折り返しを許可する時は、toolbarのResizeイベントで
    //Panelの位置を変更する必要がある
    tbar.Wrappable = false;

    bool first = true;
    do
    {
        //セパレータを追加する
        ToolBarButton sep = new ToolBarButton();
        sep.Style = ToolBarButtonStyle.Separator;
        tbar.Buttons.Add(sep);
        //左端の座標を記憶
        if (first)
        {
            sepLeft = sep.Rectangle.Left;
            sepTop = sep.Rectangle.Top;
            first = false;
        }
        //右下の座標を取得
        sepRight = sep.Rectangle.Right;
        sepBottom = sep.Rectangle.Bottom;
        //コントロールの幅より小さい時は、さらにセパレータを追加
    } while(sepRight - sepLeft + 1 < ctr.Width);

    //ツールバーにパネルを追加し、大きさを合わせる
    Panel pnl = new Panel();
    tbar.Controls.Add(pnl);
    pnl.SetBounds(sepLeft, sepTop, sepRight - sepLeft + 1,
        sepBottom - sepTop + 1);
    pnl.BringToFront();

    //パネルにコントロールを追加する
    pnl.Controls.Add(ctr);
    ctr.Dock = DockStyle.Fill;
}

次に上記メソッドを使用する例を示します。フォームにツールバーToolBar1とコンボボックスComboBox1があるとして、ToolBar1にいくつかのボタンと、ComboBox1を追加しています。

VB.NET
コードを隠すコードを選択
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As EventArgs) Handles MyBase.Load
    Dim tbb As ToolBarButton

    'ツールバーにボタンを追加
    tbb = New ToolBarButton
    tbb.ImageIndex = 1
    ToolBar1.Buttons.Add(tbb)

    'ツールバーにセパレータを追加
    tbb = New ToolBarButton
    tbb.Style = ToolBarButtonStyle.Separator
    ToolBar1.Buttons.Add(tbb)

    'ツールバーにComboBox1を追加
    AddControlInToolbar(ComboBox1, ToolBar1)

    'ツールバーにセパレータを追加
    tbb = New ToolBarButton
    tbb.Style = ToolBarButtonStyle.Separator
    ToolBar1.Buttons.Add(tbb)

    'ツールバーにボタンを追加
    tbb = New ToolBarButton
    tbb.ImageIndex = 2
    ToolBar1.Buttons.Add(tbb)
End Sub
C#
コードを隠すコードを選択
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, System.EventArgs e)
{
    ToolBarButton tbb;

    //ツールバーにボタンを追加
    tbb = new ToolBarButton();
    tbb.ImageIndex = 1;
    ToolBar1.Buttons.Add(tbb);

    //ツールバーにセパレータを追加
    tbb = new ToolBarButton();
    tbb.Style = ToolBarButtonStyle.Separator;
    ToolBar1.Buttons.Add(tbb);

    //ツールバーにComboBox1を追加
    AddControlInToolbar(ComboBox1, ToolBar1);

    //ツールバーにセパレータを追加
    tbb = new ToolBarButton();
    tbb.Style = ToolBarButtonStyle.Separator;
    ToolBar1.Buttons.Add(tbb);

    //ツールバーにボタンを追加
    tbb = new ToolBarButton();
    tbb.ImageIndex = 2;
    ToolBar1.Buttons.Add(tbb);
}

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

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