ToolStrip

ツールバーなどのコンテナとなるクラスです。

クラス階層

  • System.Windows.Forms.Control
    • System.Windows.Forms.ScrollableControl
      • System.Windows.Forms.ToolStrip
        • System.Windows.Forms.BindingNavigator
        • System.Windows.Forms.MenuStrip (メニュー)
        • System.Windows.Forms.StatusStrip (ステータスバー)
        • System.Windows.Forms.ToolStripDropDown
          • System.Windows.Forms.ToolStripDropDownMenu
    • System.Windows.Forms.ToolBar
対応関係
 
ToolBar ToolStrip

ToolBarは、.NET Core 3.1以降では利用できません。ToolBar クラス (System.Windows.Forms) | Microsoft Learn

プロパティ

プロパティ   既定値
ToolStripItemCollection Items このコントロールに属しているすべてのToolStripItem  
ToolStripItemCollection DisplayedItems 現在表示されているToolStripItem。ToolStripに自動で追加された項目を含む  
ToolStripLayoutStyle LayoutStyle 項目の配置方法  
Orientation Orientation ToolStripPanelの向き  
bool CanOverflow trueならば、項目がオーバーフローメニューに送られる。falseのとき表示する領域が不足していると、その項目全体が表示されなくなる true
ToolStripRenderMode RenderMode 描画スタイル ManagerRenderMode
bool Stretch trueならば、ToolStripContainerの端まで拡大する false
ToolStripGripStyle GripStyle 移動ハンドルを表示するかどうか
  • Hidden
  • Visible
 
bool TabStop trueならば、TabキーでTabIndexに従いフォーカスを得られる。さもなくばTabキーでToolStrip内の項目のフォーカスが順に移る false
bool ShowItemToolTips trueならば、ツールチップを表示する  
bool DefaultShowItemToolTips つねにtrueで、既定でツールチップを表示する  
       
プロパティ - ToolStrip クラス (System.Windows.Forms) | MSDN

Items

デザイナからは、次のコントロールを配置できます。

これ以外のコントロールも、ToolStripItemを継承しているならば配置できます。またToolStripControlHostはこのクラスを継承するため、これでラップすることで任意のControlを配置できます。

Button button = new Button();
toolStrip.Items.Add(new ToolStripControlHost(button));
ToolStripControlHost クラス (System.Windows.Forms) | Microsoft Learn

LayoutStyle

列挙子 割付方法
StackWithOverflow 自動的に配置
HorizontalStackWithOverflow 水平方向。必要ならばオーバーフロー [既定] ※1
VerticalStackWithOverflow 垂直方向で中央揃え。必要ならばオーバーフロー ※1
Flow ※2 必要に応じて水平または垂直方向
Table ※2 左揃え
ToolStripLayoutStyle 列挙型 (System.Windows.Forms) | MSDN
※1 CanOverflowがfalseだと、オーバーフローされない。なおMenuStripやStatusStripは既定でfalse ※2 FlowまたはTableだと、ToolStripItem.Alignmentの指定が無視される

RenderMode

列挙子 描画方法
Custom 他の描画方法が適用されない
System ToolStripSystemRendererクラスを用いる
Professional ToolStripProfessionalRendererクラスを用いる
ManagerRenderMode 次のいずれかによって描画スタイルが決定される
  • ToolStripManager.RenderMode
  • ToolStripManager.Renderer
ToolStripRenderMode 列挙型 (System.Windows.Forms) | Microsoft Learn

TabStop

これをtrueとすることでTabキーで他のコントロールからフォーカスを得られ、ToolStrip内の末尾のコントロールからTabで他のコントロールへフォーカスを移動できるようになります。しかしShift + Tabで逆順にフォーカスを移動した場合は、先頭のコントロールから末尾へ移動してしまい、他のコントロールへフォーカスが移動することはありません。

class MyToolStrip : ToolStrip
{
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == (Keys.Shift | Keys.Tab))
        {
            Control activeControl = GetContainerControl().ActiveControl;
            if (!SelectNextControl(activeControl, false, true, true, false))
            {
                // ToolStrip内で前のコントロールへフォーカスを移動できなかったならば、
                // 親コンテナー内でフォーカスを移動する
                return Parent.SelectNextControl(this, false, true, true, true);
            }
            else
            {
                return true;
            }
        }
        return base.ProcessDialogKey(keyData);
    }
}

Font

Controlのプロパティがオーバーライドされており、値を指定しないと他のコントロールと異なるフォントになることがあります。c# - Font Inheritance in Windows Forms - Stack Overflow

  1. 有効なフォントセットがあるならば、基本クラス (Control) のフォント
    (既定で"MS UI Gothic, 9pt")
  2. privateなフィールドであるdefaultFontがnullならば、ToolStripManager.DefaultFont
    (Windows 10では既定で"Yu Gothic UI, 9pt")
  3. defaultFont
Font - ToolStrip.cs

ウィンドウが非アクティブな状態でのクリック

ToolStrip上に配置されたToolStripButtonなどはウィンドウがアクティブでなければ応答しないため、非アクティブな状態からボタンをクリックしてもウィンドウがアクティブになるだけで、ボタンをクリックしたことにはなりません。これはToolBarクラスとは異なる挙動です。

これを従来のように動作させるにはToolStripを継承したクラスを作成し、MouseEnterでフォーカスを得るようにします。

public class MyToolStrip : System.Windows.Forms.ToolStrip
{
    protected override void OnMouseEnter(EventArgs e)
    {
        base.OnMouseEnter(e);

        if (!Focused) Focus();
    }
}
net - Windows requires a click to activate a window before a second click will select a button. How can I change this? - Stack Overflow

ただしこの方法だとクリックしなくてもToolStripにフォーカスが合ったままとなるため、意図せずフォーカスが移ることがあります。

そもそもクリックに応答しないのはWM_MOUSEACTIVATEメッセージに対してMA_NOACTIVATEが返されているためであり、この処理が呼ばれないようにすることでも対処できます。 WndProc - ToolStrip.cs WM_MOUSEACTIVATE message (Winuser.h) - Win32 apps | Microsoft Learn

public class MyToolStrip : System.Windows.Forms.ToolStrip
{
    protected override void WndProc(ref Message m)
    {
        const int WM_MOUSEACTIVATE = 0x0021;
        if (m.Msg != WM_MOUSEACTIVATE)
        {
            base.WndProc(ref m);
        }
    }
]
「非アクティブダイアログ上のツールボタンを1クリックで押したい」(1) Insider.NET - @IT
Microsoft Learnから検索