ToolStrip コントロールのアーキテクチャ

ToolStrip および ToolStripItem クラスにより、ツール バー、状態、メニュー項目を表示するための柔軟で拡張可能なシステムが提供されます。 これらのクラスはすべて System.Windows.Forms 名前空間に含まれており、通常は "ToolStrip" というプレフィックス (ToolStripOverflow など) または "Strip" というサフィックス (MenuStrip など) が名前に付いています。

ToolStrip

以下のトピックでは、ToolStrip とそれから派生するコントロールについて説明します。

ToolStrip は、MenuStripStatusStripContextMenuStrip に対する抽象基底クラスです。 次のオブジェクト モデルは、ToolStrip の継承階層を示したものです。

Diagram that shows the ToolStrip object model.

ToolStrip 内のすべての項目には、Items コレクションを使用してアクセスできます。 ToolStripDropDownItem 内のすべての項目には、DropDownItems コレクションを使用してアクセスできます。 ToolStrip の派生クラスでは、DisplayedItems プロパティを使用して、現在表示されている項目のみにアクセスすることもできます。 これらは、現在オーバーフロー メニューに含まれていない項目です。

以下の項目は、すべての方向について ToolStripSystemRendererToolStripProfessionalRenderer の両方でシームレスに動作するように特に設計されています。 これらは、ToolStrip コントロールでデザイン時に既定で使用できます。

MenuStrip は、MainMenu を置き換える最上位レベルのコンテナーです。 また、主要な処理とマルチドキュメント インターフェイス (MDI) 機能も提供されています。 ToolStripDropDownItemToolStripMenuItem は、機能的には MenuStrip と連動しますが、ToolStripItem から派生しています。

以下の項目は、すべての方向について ToolStripSystemRendererToolStripProfessionalRenderer の両方でシームレスに動作するように特に設計されています。 これらは、MenuStrip コントロールでデザイン時に既定で使用できます。

StatusStrip

StatusStripStatusBar コントロールを置換します。 StatusStrip の特別な機能としては、カスタム テーブル レイアウト、フォームのサイズ変更グリップと移動グリップのサポート、ToolStripStatusLabel を使用可能なスペースいっぱいに自動的に表示できる Spring プロパティがあります。

以下の項目は、すべての方向について ToolStripSystemRendererToolStripProfessionalRenderer の両方でシームレスに動作するように特に設計されています。 これらは、StatusStrip コントロールでデザイン時に既定で使用できます。

ContextMenuStrip

ContextMenuContextMenuStrip に置き換えられます。 ContextMenuStrip を任意のコントロールと関連付けることができ、右クリックするとコンテキスト メニュー (つまりショートカット メニュー) が自動的に表示されます。 Show メソッドを使用することにより、プログラムで ContextMenuStrip を表示できます。 動的なデータ設定や複数クリックのシナリオを処理するため、キャンセル可能な ContextMenuStrip および Opening イベントが Closing によってサポートされています。 ContextMenuStrip では、画像、メニュー項目のチェック状態、テキスト、アクセス キー、ショートカット、カスケード メニューがサポートされています。

以下の項目は、すべての方向について ToolStripSystemRendererToolStripProfessionalRenderer の両方でシームレスに動作するように特に設計されています。 これらは、ContextMenuStrip コントロールでデザイン時に既定で使用できます。

ToolStrip の汎用機能

以下のトピックでは、ToolStrip とその派生コントロールに共通する機能と動作について説明します。

描画

ToolStrip コントロールを使用すると、複数の方法でカスタム描画を行うことができます。 他の Windows フォーム コントロールと同様に、ToolStripToolStripItem のどちらにも、オーバーライド可能 な OnPaint メソッドと Paint イベントがあります。 通常の描画と同様に、座標系の基準はコントロールのクライアント領域です。つまり、コントロールの左上隅が 0, 0 です。 ToolStripItemPaint イベントと OnPaint メソッドは、他のコントロール描画イベントと同様に動作します。

また、ToolStrip コントロールの ToolStripRenderer クラスを使用すると、項目とコンテナーのレンダリングにきめ細かくアクセスできます。このクラスには、背景、項目の背景、項目の画像、項目の矢印、項目のテキスト、ToolStrip の境界線を描画するための、オーバーライド可能なメソッドがあります。 これらのメソッドのイベント引数により、四角形、色、テキストの書式など、必要に応じて調整できるいくつかのプロパティが公開されています。

項目の描画方法に関するいくつかの側面だけを調整するには、通常、ToolStripRenderer をオーバーライドします。

新しい項目を作成していて、描画のすべての側面を制御したい場合は、OnPaint メソッドをオーバーライドします。 OnPaint 内から、ToolStripRenderer のメソッドを使用できます。

既定では、ToolStrip によってダブル バッファリングが行われ、OptimizedDoubleBuffer の設定が利用されます。

ペアレンティング

コンテナーの所有権とペアレンティングの概念は、Windows フォームの他のコンテナー コントロールより ToolStrip コントロールの方が複雑です。 これは、オーバーフロー、複数の ToolStrip 項目間でのドロップダウン項目の共有、コントロールからの ContextMenuStrip の生成のサポートなどの動的なシナリオをサポートするために必要です。

次の一覧では、ペアレンティングに関連するメンバーとその使用方法について説明します。

  • OwnerItem は、ドロップダウン項目のソースである項目にアクセスするために使用します。 これは SourceControl に似ていますが、コントロールを返すのではなく、ToolStripItem を返します。

  • SourceControl は、複数のコントロールによって同じ ContextMenuStrip が共有されているときに、ContextMenuStrip のソースであるコントロールを特定するために使用します。

  • GetCurrentParent は、Parent プロパティの読み取り専用のアクセサーです。 所有者とは異なり、親は、項目が表示されている、返された現在の ToolStrip を示し、それはオーバーフロー領域に存在する可能性があります。

  • Owner からは、現在の ToolStripItem が含まれている項目コレクションの ToolStrip が返されます。 これは、オーバーフローを処理する特殊なコードを記述することなく、最上位レベルの ToolStripImageList や他のプロパティを参照するための最適な方法です。

継承されたコントロールの動作

以下のコントロールは、継承で使用されるときは常にロックされます。

たとえば、前の一覧の 1 つまたは複数のコントロールを使用して、新しい Windows フォーム アプリケーションを作成します。 1 つまたは複数のコントロールのアクセス修飾子を public または protected に設定して、プロジェクトをビルドします。 最初のフォームを継承するフォームを追加し、継承されたコントロールを選択します。 コントロールはロックされて表示され、アクセス修飾子が private であるかのように動作します。

ToolStripContainer による継承のサポート

次の例のように、ToolStripContainer コントロールによってサポートされる継承のシナリオには制限があります。

  1. 新しい Windows フォーム アプリケーションを作成します。

  2. フォームに ToolStripContainer を追加します。

  3. ToolStripContainer のアクセス修飾子を public または protected に設定します。

  4. ToolStripMenuStripContextMenuStrip の各コントロールの任意の組み合わせを、ToolStripContainerToolStripPanel 領域に追加します。

  5. プロジェクトをビルドします。

  6. 最初のフォームから継承するフォームを追加します。

  7. フォームで継承された ToolStripContainer を選択します。

子コントロールの継承される動作

前の手順を完了すると、次の継承された動作が行われます。

  • デザイナーで、コントロールは継承されたアイコンと共に表示されます。

  • ToolStripPanel コントロールはロックされています。それらの内容を選択または再配置することはできません。

  • ToolStripContentPanel にコントロールを追加したり、コントロールを移動したり、それらを ToolStripContentPanel の子コントロールにしたりすることはできます。

  • 変更は、フォームをビルドした後も保持されます。

    注意

    ToolStripContainer に含まれるすべての ToolStripPanel コントロールからアクセス修飾子を削除します。 ToolStripContainer のアクセス修飾子によって、コントロール全体が制御されます。

部分信頼

部分信頼における ToolStrip の制限は、承認されていない人やサービスによって使用される可能性がある個人情報が誤って入力されないように設計されています。 保護対策は次のとおりです。

  • ToolStripControlHost に項目を表示するには、ToolStripDropDown コントロールに AllWindows が必要です。 これは、ToolStripTextBoxToolStripComboBoxToolStripProgressBar などの組み込みコントロールと、ユーザーが作成したコントロールの両方に適用されます。 この要件が満たされていない場合、これらの項目は表示されません。 例外はスローされません。

  • AutoClose プロパティを false に設定することは許可されておらず、キャンセル可能な Closing イベント パラメーターは無視されます。 これにより、ドロップダウン項目を終了せずに複数のキーストロークを入力することはできません。 この要件が満たされていない場合、そのような項目は表示されません。 例外はスローされません。

  • 多くのキーストローク処理イベントは、AllWindows 以外の部分信頼コンテキストで発生した場合は、生成されません。

  • AllWindows が付与されていない場合、アクセス キーは処理されません。

使用

次の使用パターンは、ToolStrip のレイアウト、キーボード操作、エンド ユーザーの動作に影響します。

  • ToolStripPanel への参加

    ToolStrip は、1 つのToolStripPanel 内および複数の ToolStripPanel 間に再配置できます。 Dock プロパティは無視され、Stretch プロパティが false の場合、項目が ToolStripPanel に追加されると ToolStrip のサイズは大きくなります。 通常、ToolStrip はタブ オーダーに参加しません。

  • ドッキング

    ToolStrip は、コンテナーの 1 つの側面の固定位置に配置され、そのサイズはドッキングされている端全体に拡大されます。 通常、ToolStrip はタブ オーダーに参加しません。

  • 絶対配置

    ToolStrip は、他のコントロールと同じように、Location プロパティによって配置され、固定サイズであり、通常はタブ オーダーに含まれます。

キーボード操作

アクセス キー

Alt キーと組み合わせて、または Alt キーの後に押されるアクセス キーは、キーボードを使用してコントロールをアクティブ化するための 1 つの方法です。 明示的と暗黙的の両方のアクセス キーが、ToolStrip でサポートされています。 明示的な定義では、文字の前にアンパサンド (&) が使用されます。 暗黙的な定義では、特定の Text プロパティ内の文字の順序に基づいて一致する項目の検索を試みるアルゴリズムが使用されます。

ショートカット キー

MenuStrip によって使用されるショートカット キーでは、Keys 列挙型の組み合わせ (順不同) を使用してショートカット キーが定義されます。 また、ShortcutKeyDisplayString プロパティを使用して、ショートカット キーをテキストのみで表示することもできます (たとえば、"Delete" の代わりに "Del" と表示)。

Alt キーにより、MainMenuStrip によってポイントされている MenuStrip がアクティブになります。 そこから、ToolStripPanel 内の ToolStrip コントロール間を移動するには、Ctrl + Tab キーを使用します。 Tab キーおよびテンキーの方向キーを使用すると、ToolStrip 内の項目間を移動します。 特殊なアルゴリズムにより、オーバーフロー領域でのナビゲーションが処理されます。 Space キーを押すと、ToolStripButtonToolStripDropDownButton、または ToolStripSplitButton が選択されます。

フォーカスと検証

Alt キーによってアクティブ化された場合は、通常、MenuStrip または ToolStrip により、現在フォーカスを持っているコントロールからフォーカスが取得または削除されることはありません。 MenuStrip 内でホストされているコントロールまたは MenuStrip のドロップダウンがある場合、ユーザーが Tab キーを押すとコントロールにフォーカスが設定されます。 一般に、MenuStripGotFocusLostFocusEnterLeave の各イベントは、キーボードによってアクティブ化されたときは発生しない可能性があります。 そのような場合は、代わりに MenuActivate および MenuDeactivate イベントを使用します。

既定では、CausesValidationfalse です。 検証を実行するには、フォームで Validate を明示的に呼び出します。

レイアウト

ToolStrip のレイアウトを制御するには、LayoutStyle プロパティで ToolStripLayoutStyle のメンバーのいずれかを選択します。

スタック レイアウト

スタックとは、ToolStripの両端に項目を並べて配置することです。 次の一覧はスタック レイアウトの説明です。

スタック レイアウトのその他の機能

Alignment により、項目が整列される ToolStrip の端が決定されます。

項目が ToolStrip 内に収まらない場合は、オーバーフロー ボタンが自動的に表示されます。 Overflow プロパティの設定により、項目がオーバーフロー領域に常に表示されるか、必要に応じて表示されるか、または表示されないかが決まります。

LayoutCompleted イベントで Placement プロパティを調べて、項目がメインの ToolStrip に配置されたか、オーバーフロー ToolStrip か、それとも現在はまったく表示されていないかを確認できます。 項目が表示されない理由として一般的なのは、項目がメインの ToolStrip に収まらず、その Overflow プロパティが Never に設定されていた場合です。

ToolStripToolStripPanel に格納し、その GripStyleVisible に設定することで、それを移動可能にします。

その他のレイアウト オプション

その他のレイアウト オプションとして、FlowTable があります。

フロー レイアウト

Flow レイアウトは、ContextMenuStripToolStripDropDownMenuToolStripOverflow の既定の設定です。 それは FlowLayoutPanel に似ています。 Flow レイアウトの機能は次のとおりです。

  • FlowLayoutPanel のすべての機能は、LayoutSettings プロパティによって公開されます。 LayoutSettings クラスを FlowLayoutSettings クラスにキャストする必要があります。

  • コードで DockAnchor プロパティを使用して、行内の項目を揃えることができます。

  • Alignment プロパティは無視されます。

  • LayoutCompleted イベントで Placement プロパティを調べて、項目がメインの ToolStrip に配置されたか、または収まらなかったかを判断できます。

  • グリップはレンダリングされないため、ToolStripPanel 内の Flow レイアウト スタイルの ToolStrip は移動できません。

  • ToolStrip オーバーフロー ボタンはレンダリングされず、Overflow は無視されます。

テーブル レイアウト

Table レイアウトは、StatusStrip の既定の設定です。 それは TableLayoutPanel に似ています。 Flow レイアウトの機能は次のとおりです。

  • TableLayoutPanel のすべての機能は、LayoutSettings プロパティによって公開されます。 LayoutSettings クラスを TableLayoutSettings クラスにキャストする必要があります。

  • コードで DockAnchor プロパティを使用して、テーブル セル内の項目を揃えることができます。

  • Alignment プロパティは無視されます。

  • LayoutCompleted イベントで Placement プロパティを調べて、項目がメインの ToolStrip に配置されたか、または収まらなかったかを判断できます。

  • グリップはレンダリングされないため、ToolStripPanel 内の Table レイアウト スタイルの ToolStrip は移動できません。

  • ToolStrip オーバーフロー ボタンはレンダリングされず、Overflow は無視されます。

ToolStripItem

以下のトピックでは、ToolStripItem とそれから派生するコントロールについて説明します。

ToolStripItem は、ToolStrip に格納されるすべての項目の抽象基底クラスです。 次のオブジェクト モデルは、ToolStripItem の継承階層を示したものです。

Diagram that shows the ToolStripItem object model.

ToolStripItem クラスは、ToolStripItem を直接継承するか、ToolStripItemToolStripControlHost、または ToolStripDropDownItem を間接的に継承します。

ToolStripItem コントロールは、ToolStripMenuStripStatusStrip、または ContextMenuStrip に含まれる必要があり、フォームに直接追加することはできません。 さまざまなコンテナー クラスは、ToolStripItem コントロールの適切なサブセットを含むように設計されています。

次の表は、ストック ToolStripItem コントロールと、それらが最適に表示されるコンテナーの一覧です。 任意の ToolStrip 項目を任意の ToolStrip 派生コンテナーでホストできますが、これらの項目は次のコンテナーで表示されるのが最適なように設計されています。

注意

ToolStripDropDown はデザイナーのツールボックスには表示されません。

含まれる項目 ToolStrip MenuStrip ContextMenuStrip StatusStrip ToolStripDropDown
ToolStripButton はい No 番号 番号 イエス
ToolStripComboBox イエス イエス 有効 無効 イエス
ToolStripSplitButton 有効 No 番号 イエス イエス
ToolStripLabel 有効 No 番号 イエス イエス
ToolStripSeparator イエス イエス 有効 無効 イエス
ToolStripDropDownButton 有効 No 番号 イエス イエス
ToolStripTextBox イエス イエス 有効 無効 イエス
ToolStripMenuItem 無効 イエス 有効 No 番号
ToolStripStatusLabel 番号 番号 番号 イエス 無効
ToolStripProgressBar イエス No 番号 イエス 無効
ToolStripControlHost イエス 有効 無効 イエス はい

ToolStripButton

ToolStripButton は、ToolStrip 用のボタン項目です。 さまざまな境界線スタイルを使用してそれを表示することができ、それを使用して操作状態を表したり、アクティブ化したりすることができます。 また、既定でフォーカスが設定されるように定義することもできます。

ToolStripLabel

ToolStripLabel により、ToolStrip コントロールでのラベル機能が提供されます。 ToolStripLabel は、ToolStripButton のように、既定ではフォーカスを設定されず、押された状態または強調表示された状態としてはレンダリングされません。

ホストされた項目としての ToolStripLabel では、アクセス キーがサポートされます。

ToolStrip でリンク コントロールをサポートするには、ToolStripLabelLinkColorLinkVisitedLinkBehavior、プロパティを使用します。

ToolStripStatusLabel

ToolStripStatusLabel は、StatusStrip で使用するために特に設計された ToolStripLabel のバージョンです。 特別な機能には、BorderStyleBorderSidesSpring が含まれます。

ToolStripSeparator

ToolStripSeparator を使用すると、向きに応じて、ツール バーまたはメニューに垂直または水平の線が追加されます。 メニューの項目など、項目のグループ化や区別が提供されます。

ドロップダウン リストから選択することにより、デザイン時に ToolStripSeparator を追加できます。 ただし、デザイナー テンプレート ノードまたは Add メソッドでハイフン (-) を入力することにより、ToolStripSeparator を自動的に作成することもできます。

ToolStripControlHost

ToolStripControlHost は、ToolStripComboBoxToolStripTextBoxToolStripProgressBar に対する抽象基底クラスです。 ToolStripControlHost を使用すると、次の 2 つの方法で、カスタム コントロールなどの他のコントロールをホストできます。

  • Control の派生クラスを使用して、ToolStripControlHost を構築します。 ホストされているコントロールとプロパティに完全にアクセスするには、Control プロパティをそれによって表される実際のクラスにキャストして戻す必要があります。

  • ToolStripControlHost を拡張し、継承されたクラスのパラメーターなしのコンストラクターで、基底クラスのコンストラクターを呼び出して、Control から派生したクラスを渡します。 このオプションを使用すると、ToolStrip で簡単にアクセスできるように、コントロールの一般的なメソッドとプロパティをラップできます。

ToolStripComboBox

ToolStripComboBox は、ToolStrip でのホスト用に最適化された ComboBox です。 ToolStripComboBox レベルではホストされているコントロールのプロパティとイベントのサブセットが公開されますが、ComboBox プロパティを使用することで基になる ComboBox コントロールに完全にアクセスできます。

ToolStripTextBox

ToolStripTextBox は、ToolStrip でのホスト用に最適化された TextBox です。 ToolStripTextBox レベルではホストされているコントロールのプロパティとイベントのサブセットが公開されますが、TextBox プロパティを使用することで基になる TextBox コントロールに完全にアクセスできます。

ToolStripProgressBar

ToolStripProgressBar は、ToolStrip でのホスト用に最適化された ProgressBar です。 ToolStripProgressBar レベルではホストされているコントロールのプロパティとイベントのサブセットが公開されますが、ProgressBar プロパティを使用することで基になる ProgressBar コントロールに完全にアクセスできます。

ToolStripDropDownItem

ToolStripDropDownItemToolStripMenuItemToolStripDropDownButtonToolStripSplitButton の抽象基底クラスであり、項目を直接ホストすることも、ドロップダウン コンテナーで追加の項目をホストすることもできます。 これを行うには、DropDown プロパティを ToolStripDropDown に設定し、ToolStripDropDownItems プロパティを設定します。 これらのドロップダウン項目には、DropDownItems プロパティを使用して直接アクセスします。

ToolStripMenuItem

ToolStripMenuItem は、メニューの特別な強調表示、レイアウト、列の配置を処理するために ToolStripDropDownMenu および ContextMenuStrip で動作する ToolStripDropDownItem です。

ToolStripDropDownButton

ToolStripDropDownButtonToolStripButton のように見えますが、ユーザーがクリックするとドロップダウン領域が表示されます。 ShowDropDownArrow プロパティを設定することにより、ドロップダウン矢印を表示または非表示にします。 ToolStripDropDownButton により、ToolStrip をオーバーフローした項目を表示する ToolStripOverflowButton がホストされます。

ToolStripSplitButton

ToolStripSplitButton は、ボタンとドロップダウン ボタンの機能を組み合わせたものです。

選択されたドロップダウン項目の Click イベントと、ボタンに表示される項目を同期するには、DefaultItem プロパティを使用します。

ToolStripItem の汎用機能

ToolStripItem には、コントロールを継承するための次の一般的な機能とオプションが用意されています。

  • コア イベント

  • 画像の処理

  • アラインメント

  • テキストと画像の関係

  • 表示スタイル

コア イベント

ToolStripItem コントロールで独自のクリック、マウス、および描画イベントを受け取り、一部のキーボードの前処理も実行できます。

画像の処理

ImageImageAlignImageIndexImageKeyImageScaling の各プロパティは、画像処理のさまざまな側面に関連します。 ToolStrip コントロール内で画像を使用するには、これらのプロパティを直接設定するか、実行時のみの ImageList プロパティを設定します。

画像の拡大縮小は、次のように、ToolStripToolStripItem 両方のプロパティの相互作用によって決定されます。

アラインメント

Alignment プロパティの値によって、項目が表示される ToolStrip の末尾が決まります。 Alignment プロパティは、ToolStrip のレイアウト スタイルがスタック オーバーフローの値のいずれかに設定されている場合にのみ機能します。

項目は、項目コレクション内での項目の順序で ToolStrip に配置されます。 項目がレイアウトされる位置をプログラムで変更するには、Insert メソッドを使用してコレクション内の項目を移動します。 このメソッドでは項目は移動されますが、複製されることはありません。

テキストと画像の関係

TextImageRelation プロパティにより、ToolStripItem 上のテキストを基準とする画像の相対的な配置を定義します。 画像とテキストのどちらか一方または両方を持たない項目は、ToolStripItem によって欠落している要素の位置に空白が表示されないように、特殊なケースとして扱われます。

表示スタイル

DisplayStyle を使用すると、項目のテキストと画像のプロパティの値を設定して、必要なものだけを表示することができます。 これは、通常、同じ項目を異なるコンテキストで表示するときに、表示スタイルのみを変更するために使用されます。

アクセサリ クラス

その他のさまざまな機能を提供するクラスは次のとおりです。

  • ToolStripManager を使用すると、マージ、設定、レンダラー オプションなど、アプリケーション全体の ToolStrip 関連タスクがサポートされます。

  • ToolStripRenderer を使用すると、特定のスタイルまたはテーマを ToolStrip に簡単に適用できます。

  • ToolStripProfessionalRenderer を使用すると、置き換え可能なカラー テーブル (ProfessionalColorTable) に基づいて、ペンとブラシが作成されます。

  • ToolStripSystemRenderer を使用すると、システム カラーとフラットな視覚スタイルが ToolStrip アプリケーションに適用されます。

  • ToolStripContainer は、SplitContainer と似ています。 4 つのドッキングされたサイド パネル (ToolStripPanel のインスタンス) と 1 つの中央パネル (ToolStripContentPanel のインスタンス) を使用して、標準的な配置が作成されます。 サイド パネルを削除することはできませんが、非表示にすることはできます。 中央パネルは、削除することも非表示にすることもできません。 サイド パネルには 1 つまたは複数の ToolStripMenuStrip、または StatusStrip コントロールを配置でき、中央パネルは他のコントロールに使用できます。 また、ToolStripContentPanel を使用すると、フォームの本体にレンダラーのサポートを組み込んで、一貫した外観にすることもできます。 ToolStripContainer では、マルチドキュメント インターフェイス (MDI) はサポートされていません。

  • ToolStripPanel には、ToolStrip コントロールを移動および配置するための領域があります。 使用するパネルを 1 つだけにすることを選択でき、ToolStripPanel は MDI シナリオで問題なく動作します。

関連項目