次の方法で共有


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

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

ツールストリップ

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

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

ToolStrip オブジェクト モデルを示す図。

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

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

MenuStrip は、 MainMenuを置き換える最上位のコンテナーです。 また、キー処理と複数のドキュメント インターフェイス (MDI) 機能も提供します。 機能的には、 ToolStripDropDownItemToolStripMenuItemMenuStripと共に機能しますが、これらは ToolStripItemから派生しています。

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

ステータスストリップ

StatusStrip は、 StatusBar コントロールを置き換えます。 StatusStripの特別な機能には、カスタム テーブル レイアウト、フォームのサイズ設定と移動グリップのサポート、および使用可能な領域を自動的に埋めるSpringを許可するToolStripStatusLabel プロパティが含まれます。

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

ContextMenuStrip

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

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

ToolStrip の汎用機能

次のトピックでは、 ToolStrip および派生コントロールに汎用の機能と動作について説明します。

絵画

ToolStrip コントロールでは、いくつかの方法でカスタム 描画を実行できます。 他の Windows フォーム コントロールと同様に、 ToolStripToolStripItem の両方にオーバーライド可能な OnPaint メソッドと Paint イベントがあります。 通常の描画と同様に、座標系はコントロールのクライアント領域に対して相対的です。つまり、コントロールの左上隅は 0、0 です。 PaintOnPaint イベントとToolStripItem メソッドは、他のコントロール ペイント イベントと同様に動作します。

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

アイテムの描画方法の一部のみを調整するには、通常、 ToolStripRendererをオーバーライドします。

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

既定では、 ToolStrip は、 OptimizedDoubleBuffer 設定を利用してダブル バッファーされます。

子育て

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

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

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

  • SourceControlは、複数のコントロールが同じContextMenuStripを共有する場合に、どのコントロールがContextMenuStripのソースであるかを決定します。

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

  • Ownerは、Items コレクションに現在のToolStripが含まれるToolStripItemを返します。 これは、オーバーフローを処理する特別なコードを記述せずに、最上位のImageListToolStripまたはその他のプロパティを参照する最適な方法です。

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

次のコントロールは、継承で使用されるたびにロックされます。

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

ToolStripContainer による継承のサポート

ToolStripContainer コントロールは、次の例のように、限られた継承されたシナリオをサポートします。

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

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

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

  4. ToolStripMenuStrip、およびContextMenuStripコントロールの任意の組み合わせを、ToolStripPanelToolStripContainer領域に追加します。

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

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

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

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

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

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

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

  • ToolStripContentPanelにコントロールを追加し、コントロールを移動して、ToolStripContentPanelの子コントロールにすることができます。

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

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

部分信頼

部分的な信頼に基づく ToolStripの制限は、承認されていないユーザーまたはサービスによって使用される可能性のある個人情報が不注意で入力されるのを防ぐために設計されています。 保護対策は次のとおりです。

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

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

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

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

使用方法

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

  • 参加済み ToolStripPanel

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

  • ドッキング

    ToolStripは固定位置のコンテナーの一方の側に配置され、そのサイズはドッキング先のエッジ全体に拡大されます。 通常、 ToolStrip はタブ オーダーには含まれません。

  • 絶対位置指定

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

キーボード操作

アクセス キー

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

ショートカット キー

MenuStripによって使用されるショートカット キーは、(順序固有ではない) Keys列挙体の組み合わせを使用してショートカット キーを定義します。 ShortcutKeyDisplayString プロパティを使用して、"削除" ではなく "Del" を表示するなど、テキストのみを含むショートカット キーを表示することもできます。

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

フォーカスと検証

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

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

レイアウト

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

スタック レイアウト

積み重ねとは、ToolStripの両端でアイテムを隣り合わせに配置することです。 次の一覧では、スタック レイアウトについて説明します。

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

Alignment は、項目の配置先となる ToolStrip の末尾を決定します。

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

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

ToolStripに配置し、そのToolStripPanelGripStyleに設定して、Visibleを移動可能にします。

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

その他のレイアウト オプションは、 FlowTableです。

フロー レイアウト

Flow layout は、 ContextMenuStripToolStripDropDownMenu、および ToolStripOverflowの既定値です。 これは、 FlowLayoutPanelに似ています。 Flowレイアウトの機能は次のとおりです。

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

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

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

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

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

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

テーブル レイアウト

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

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

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

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

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

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

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

ToolStripItem

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

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

ToolStripItem オブジェクト モデルを示す図。

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

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

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

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

包含アイテム ツールストリップ MenuStrip ContextMenuStrip ステータスストリップ ツールストリップドロップダウン
ToolStripButton イエス いいえ いいえ いいえ イエス
ToolStripComboBox イエス イエス イエス いいえ イエス
ToolStripSplitButton イエス いいえ いいえ イエス イエス
ToolStripLabel イエス いいえ いいえ イエス イエス
ToolStripSeparator イエス イエス イエス いいえ イエス
ToolStripDropDownButton イエス いいえ いいえ イエス イエス
ToolStripTextBox イエス イエス イエス いいえ イエス
ToolStripMenuItem いいえ イエス イエス いいえ いいえ
ToolStripStatusLabel いいえ いいえ いいえ イエス いいえ
ToolStripProgressBar イエス いいえ いいえ イエス いいえ
ToolStripControlHost イエス イエス いいえ イエス イエス

ツールストリップボタン

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

ツールストリップラベル

ToolStripLabelは、ToolStrip コントロールのラベル機能を提供します。 ToolStripLabelは、既定ではフォーカスを取得せず、プッシュまたは強調表示としてレンダリングされないToolStripButtonのようなものです。

ToolStripLabel ホストされる項目はアクセス キーをサポートします。

LinkColorのリンク コントロールをサポートするには、LinkVisitedLinkBehaviorToolStripLabel、およびToolStripプロパティを使用します。

ツールストリップのステータスラベル

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

ツールストリップセパレーター

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

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

ツールストリップコントロールホスト

ToolStripControlHost は、 ToolStripComboBoxToolStripTextBox、および ToolStripProgressBarの抽象基底クラスです。 ToolStripControlHost では、次の 2 つの方法で、カスタム コントロールを含む他のコントロールをホストできます。

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

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

ツールストリップコンボボックス (ToolStripComboBox)

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

ToolStripTextBox (ツールストリップテキストボックス)

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

ToolStripProgressBar

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

ToolStripDropDownItem

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

ToolStripMenuItem

ToolStripMenuItemは、メニューの特別な強調表示、レイアウト、列の配置を処理するToolStripDropDownItemToolStripDropDownMenuで動作するContextMenuStripです。

ToolStripDropDownButton

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

ツールストリップスプリットボタン

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

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

ToolStripItem の汎用機能

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

  • コア イベント

  • 画像の処理

  • アラインメント

  • テキストと画像のリレーションシップ

  • 表示スタイル

コア イベント

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

画像処理

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

イメージのスケーリングは、次のように、 ToolStripToolStripItemの両方のプロパティの相互作用によって決まります。

アラインメント

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

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

テキストと画像のリレーションシップ

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

表示スタイル

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

アクセサリ クラス

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

  • 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 シナリオで適切に機能します。

こちらも参照ください