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

更新 : 2007 年 11 月

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

ToolStrip

このトピックでは、ToolStrip およびこのクラスから派生するコントロールについて説明します。

ToolStrip は、MenuStripStatusStrip、および ContextMenuStrip の抽象基本クラスです。次のオブジェクト モデルは、ToolStrip 継承階層構造を示しています。

ToolStrip オブジェクト モデル
ToolStrip オブジェクト モデル

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

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

MenuStrip は、MainMenu よりも優先されるトップレベルのコンテナです。これには、キー処理機能とマルチ ドキュメント インターフェイス (MDI) 機能も用意されています。ToolStripDropDownItemToolStripMenuItemToolStripItem から派生しますが、機能的には MenuStrip と連携して動作します。

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

StatusStrip

StatusStripStatusBar コントロールを置き換えます。StatusStrip の特別な機能には、カスタムのテーブル レイアウトや、フォームのサイズ変更グリップと移動グリップのサポートがあります。また、使用可能な領域を ToolStripStatusLabel で自動的に設定できる Spring プロパティもあります。

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

ContextMenuStrip

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

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

ToolStrip の汎用機能

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

描画

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

ToolStrip コントロールでは、ToolStripRenderer クラスを使用することにより、項目やコンテナの描画の細部にアクセスすることもできます。このクラスには、ToolStrip の背景、項目の背景、項目のイメージ、項目の矢印、項目のテキスト、および境界を描画するためのオーバーライド可能なメソッドがあります。これらのメソッドのイベント引数として、長方形、色、テキスト形式など、必要に応じて調整できるプロパティが公開されます。

項目の描画方法の一部だけを調整するには、通常、ToolStripRenderer をオーバーライドします。

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

既定では、ToolStripOptimizedDoubleBuffer 設定を利用してダブル バッファリングを行います。

ペアレンティング

コンテナの所有権とペアレンティングの概念は、他の 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 の子コントロールすることもできます。

  • 変更内容はフォームのビルド後も保持されます。

    fadw9ex2.alert_note(ja-jp,VS.90).gifメモ :

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

部分信頼

部分的にしか信頼のない状況では、不用意に入力した個人情報が認証されていない個人やサービスから使われることのないように、ToolStrip に制限が適用されます。次のような保護方法があります。

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

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

  • AllWindows 以外の部分信頼の状況でキーストロークが発生しても、多くのキーストローク処理イベントは生成されません。

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

使用法

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

  • ToolStripPanel への追加

    ToolStrip は、ToolStripPanel 内および ToolStripPanel 間に移動できます。Dock プロパティは無視されます。また、Stretch プロパティが false の場合は、項目が ToolStripPanel に追加されるたびに ToolStrip のサイズが増加します。通常、ToolStrip はタブ オーダーに含められません。

  • ドッキング

    ToolStrip はコンテナの一辺の固定位置に配置され、サイズがドッキング対象の辺全体に拡張されます。通常、ToolStrip はタブ オーダーに含められません。

  • 絶対配置

    他のコントロールと同様に、ToolStripLocation プロパティによって配置され、サイズが固定され、通常はタブ オーダーに含められます。

キーボードによる対話操作

アクセス キー

Alt キーと同時または Alt キーに続けてアクセス キーを入力する操作は、キーボードを使用してコントロールをアクティブ化する 1 つの方法です。ToolStrip では、明示的および暗黙的なアクセス キーの両方がサポートされます。明示的な定義では、文字の前にアンパサンド (&) 文字を付けます。暗黙的な定義では、指定された Text プロパティの文字の順序に基づいて、一致する項目を検出するアルゴリズムが使用されます。

ショートカット キー

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

ナビゲーション

Alt キーは、MainMenuStrip で指定される MenuStrip をアクティブ化します。この状態で Ctrl + Tab キーを使用すると、ToolStripPanel 内の ToolStrip コントロール間を移動できます。Tab キーおよびテンキーの方向キーを使用すると、ToolStrip の項目間を移動できます。オーバーフロー領域の移動は、特別なアルゴリズムによって処理されます。Space キーを押すと、ToolStripButtonToolStripDropDownButton、または ToolStripSplitButton が選択されます。

フォーカスと検証

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

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

レイアウト

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

レイアウトのスタック

スタックとは、ToolStrip の両端に項目どうしを並べる配置方法です。次の一覧で、スタック レイアウトについて説明します。

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

Alignment は、項目を整列するときの基準となる ToolStrip の一端を決定します。

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

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

ToolStrip を移動できるようにするには、ToolStripPanel に配置し、GripStyleVisible に設定します。

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

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

フロー レイアウト

Flow は、ContextMenuStripToolStripDropDownMenu、および ToolStripOverflow における既定値です。これは、FlowLayoutPanel と同様です。Flow レイアウトの機能は次のとおりです。

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

  • コードで Dock プロパティと Anchor プロパティを使用して、行内の項目を整列できます。

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

  • LayoutCompleted イベントでは、Placement プロパティを調べることにより、項目がメインの ToolStrip に配置されたかどうかを判断できます。

  • グリップが描画されないため、ToolStripPanelFlow レイアウト スタイルでは ToolStrip を削除できません。

  • ToolStrip オーバーフロー ボタンは描画されません。また、Overflow は無視されます。

テーブル レイアウト

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

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

  • コードで Dock プロパティと Anchor プロパティを使用して、テーブル セル内の項目を整列できます。

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

  • LayoutCompleted イベントでは、Placement プロパティを調べることにより、項目がメインの ToolStrip に配置されたかどうかを判断できます。

  • グリップが描画されないため、ToolStripPanelTable レイアウト スタイルでは ToolStrip を削除できません。

  • ToolStrip オーバーフロー ボタンは描画されません。また、Overflow は無視されます。

ToolStripItem

このトピックでは、ToolStripItem およびこのクラスから派生するコントロールについて説明します。

ToolStripItem は、ToolStrip に追加されるすべての項目に対する抽象基本クラスです。次のオブジェクト モデルは、ToolStripItem 継承階層構造を示しています。

ToolStripItem オブジェクト モデル
ToolStripItem オブジェクト モデル

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

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

ToolStripItem ストック コントロールおよびこれらのコントロールが最適に表示されるコンテナを次の表に示します。ToolStrip 項目は ToolStrip の派生コンテナであればどれでもホストできますが、以下に示すコンテナ内で最適に表示されるように設計されています。

fadw9ex2.alert_note(ja-jp,VS.90).gifメモ :

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

含まれる項目

ToolStrip

MenuStrip

ContextMenuStrip

StatusStrip

ToolStripDropDown

ToolStripButton

はい

いいえ

いいえ

いいえ

はい

ToolStripComboBox

はい

はい

はい

いいえ

はい

ToolStripSplitButton

はい

いいえ

いいえ

はい

はい

ToolStripLabel

はい

いいえ

いいえ

はい

はい

ToolStripSeparator

はい

はい

はい

いいえ

はい

ToolStripDropDownButton

はい

いいえ

いいえ

はい

はい

ToolStripTextBox

はい

はい

はい

いいえ

はい

ToolStripMenuItem

いいえ

はい

はい

いいえ

いいえ

ToolStripStatusLabel

いいえ

いいえ

いいえ

はい

いいえ

ToolStripProgressBar

はい

いいえ

いいえ

はい

いいえ

ToolStripControlHost

はい

はい

いいえ

はい

はい

ToolStripButton

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

ToolStripLabel

ToolStripLabel は、ToolStrip コントロールにラベル機能を提供します。ToolStripLabelToolStripButton と似ており、既定ではフォーカスが設定されず、押下または強調表示された状態として描画されることもありません。

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

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

ToolStripStatusLabel

ToolStripStatusLabel は、StatusStrip で使用するように特別に設計されたバージョンの ToolStripLabel です。固有の機能として、BorderStyleBorderSides、および Spring があります。

ToolStripSeparator

ToolStripSeparator は、ツール バーまたはメニューの方向に応じて、縦線または横線を追加します。メニュー項目など、項目間のグループ化や区切りに使用できます。

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

ToolStripControlHost

ToolStripControlHost は、ToolStripComboBoxToolStripTextBox、および ToolStripProgressBar の抽象基本クラスです。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

ToolStripDropDownItem は、ToolStripMenuItemToolStripDropDownButton、および ToolStripSplitButton の抽象基本クラスです。項目を直接ホストしたり、ドロップダウン コンテナで追加項目をホストしたりできます。これを行うには、DropDown プロパティを ToolStripDropDown に設定し、ToolStripDropDownItems プロパティを設定します。これらのドロップダウン項目には、DropDownItems プロパティを使用して直接アクセスできます。

ToolStripMenuItem

ToolStripMenuItem は、ToolStripDropDownMenuContextMenuStrip と連携して、メニューの特殊な強調表示、レイアウト、および列の配置を処理する ToolStripDropDownItem です。

ToolStripDropDownButton

ToolStripDropDownButtonToolStripButton に似ていますが、ユーザーがクリックするとドロップダウン領域が表示される点が異なります。ShowDropDownArrow プロパティを設定することで、ドロップダウン矢印を表示または非表示にできます。ToolStripDropDownButton は、ToolStrip からオーバーフローした項目を表示する ToolStripOverflowButton をホストします。

ToolStripSplitButton

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

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

ToolStripItem の汎用機能

ToolStripItem には、次のように、継承するコントロールに共通の機能とオプションがあります。

  • コア イベント

  • イメージ処理

  • 配置

  • テキストとイメージの関係

  • 表示スタイル

コア イベント

ToolStripItem では、自身に対するクリック イベント、マウス イベント、および描画イベントを受け取り、なんらかのキーボードの前処理を実行することもできます。

イメージ処理

ImageImageAlignImageIndexImageKeyImageScaling の各プロパティは、イメージ処理のさまざまな要素に関連しています。ToolStrip コントロールでイメージを使用するには、これらのプロパティを直接設定するか、またはランタイムにのみ使用できる ImageList プロパティを設定します。

イメージの拡大と縮小は、次のように、ToolStripToolStripItem の両方のプロパティの相互関係によって決定されます。

配置

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

項目は、項目コレクションに表示される順序で ToolStrip に配置されます。項目を配置する場所をプログラムで変更するには、Insert メソッドを使用してコレクションの項目を移動します。このメソッドは項目を移動しますが、複製はしません。

テキストとイメージの関係

TextImageRelation プロパティは、ToolStripItem 上のテキストに対するイメージの相対的位置を定義します。イメージ、テキスト、またはその両方がない項目は、ToolStripItem で存在しない要素の代わりに空白が表示されないように、特別なケースとして扱われます。

表示スタイル

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

アクセサリ クラス

次のように、他にもさまざまな機能を実現するクラスがあります。

  • ToolStripManager は、アプリケーション全体について ToolStrip 関連のタスクをサポートします。たとえば、マージ、設定、レンダラのオプションなどがあります。

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

  • ToolStripProfessionalRenderer は、置き換えることのできるカラー テーブル (ProfessionalColorTable) に基づいてペンとブラシを作成します。

  • ToolStripSystemRenderer は、システム カラーとフラットな visual スタイルを ToolStrip アプリケーションに適用します。

  • ToolStripContainerSplitContainer と似ています。ドッキング対象の 4 つのサイド パネル (ToolStripPanel のインスタンス) と、1 つのセントラル パネル (ToolStripContentPanel のインスタンス) を使用して、一般的な配置が作成されます。サイド パネルは削除できませんが、非表示にすることはできます。セントラル パネルを削除または非表示にすることはできません。1 つ以上の ToolStrip コントロール、MenuStrip コントロール、または StatusStrip コントロールをサイド パネルに配置でき、他のコントロールにはセントラル パネルを使用できます。ToolStripContentPanel では、外観の一貫性を保つために、フォームの本体でレンダラをサポートすることもできます。ToolStripContainer はマルチ ドキュメント インターフェイス (MDI) をサポートしていません。

  • ToolStripPanel は、ToolStrip コントロールを移動および配置する領域を作成します。1 つのパネルだけを使用することもできますが、ToolStripPanel は MDI のシナリオにも適しています。

参照

概念

ToolStrip テクノロジの概要

参照

ToolStrip コントロールの概要 (Windows フォーム)

その他の技術情報

ToolStrip コントロール (Windows フォーム)

MenuStrip コントロール (Windows フォーム)

StatusStrip コントロール

ContextMenuStrip コントロール

BindingNavigator コントロール (Windows フォーム)