ツールバーなどのコンテナとなるクラスです。
旧 | 新 | |
---|---|---|
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 | 移動ハンドルを表示するかどうか
|
|
bool | TabStop | trueならば、TabキーでTabIndexに従いフォーカスを得られる。さもなくばTabキーでToolStrip内の項目のフォーカスが順に移る | false |
bool | ShowItemToolTips | trueならば、ツールチップを表示する | |
bool | DefaultShowItemToolTips | つねにtrueで、既定でツールチップを表示する | |
デザイナからは、次のコントロールを配置できます。
これ以外のコントロールも、ToolStripItemを継承しているならば配置できます。またToolStripControlHostはこのクラスを継承するため、これでラップすることで任意のControlを配置できます。
Button button = new Button(); toolStrip.Items.Add(new ToolStripControlHost(button));ToolStripControlHost クラス (System.Windows.Forms) | Microsoft Learn
列挙子 | 割付方法 |
---|---|
StackWithOverflow | 自動的に配置 |
HorizontalStackWithOverflow | 水平方向。必要ならばオーバーフロー [既定] ※1 |
VerticalStackWithOverflow | 垂直方向で中央揃え。必要ならばオーバーフロー ※1 |
Flow ※2 | 必要に応じて水平または垂直方向 |
Table ※2 | 左揃え |
列挙子 | 描画方法 |
---|---|
Custom | 他の描画方法が適用されない |
System | ToolStripSystemRendererクラスを用いる |
Professional | ToolStripProfessionalRendererクラスを用いる |
ManagerRenderMode | 次のいずれかによって描画スタイルが決定される
|
これを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); } }
Controlのプロパティがオーバーライドされており、値を指定しないと他のコントロールと異なるフォントになることがあります。c# - Font Inheritance in Windows Forms - Stack Overflow
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