このメモでは、ウィンドウを分割し、他のペインウィンドウのサイズ変更を管理する MFC CSplitterWnd クラスについて説明します。
スプリッターのスタイル
CSplitterWnd
では、ウィンドウを分割する 2 つの異なるスタイルがサポートされています。
"静的スプリッター" では、分割ウィンドウの作成時にペインが作成されます。 ウィンドウの順序と数は変わりません。 分割バーは、さまざまなペインのサイズを変更するために使用されます。 このスタイルを使用すると、各ペインに異なるビュー クラスを表示できます。 Visual C++ グラフィックス エディターと Windows ファイル マネージャーは、この分割スタイルを使用するプログラムの例です。 この分割ウィンドウのスタイルでは、分割ボックスは使用されません。
"動的分割" では、ユーザーが新しいビューを分割および分割解除すると、追加のペインが作成され、破棄されます。 このスプリッターは、1 つのビューから始まり、ユーザーが分割を開始するための分割ボックスを提供します。 分割ウィンドウは、ビューが一方向に分割されたときに、新しいビュー オブジェクトを動的に作成します。 この新しいビュー オブジェクトは、新しいウィンドウを表します。 キーボード インターフェイスを使用してビューが 2 方向に分割されている場合、分割ウィンドウは、3 つの新しいウィンドウに対して 3 つの新しいビュー オブジェクトを作成します。 分割がアクティブな間、ウィンドウ間の分割バーとして分割ボックスが表示されます。 ユーザーが分割を削除すると、Windows は追加のビュー オブジェクトを破棄しますが、元のビューは分割ウィンドウ自体が破棄されるまで残ります。 Microsoft Excel と Microsoft Word は、動的分割スタイルを使用するアプリケーションの例です。
いずれかの種類の分割ウィンドウを作成する場合は、スプリッターが管理する行と列の最大数を指定する必要があります。 静的スプリッターでは、すべての行と列を埋めるためのペインが作成されます。 動的スプリッターは、 CSplitterWnd
の作成時に最初のペインのみを作成します。
静的スプリッターに指定できるペインの最大数は、16 行 16 列です。 推奨される構成は次のとおりです。
1 行 x 2 列: 通常、類似しないペインがある
2 行 x 1 列: 通常、類似しないペインがある
2 行 x 2 列: 通常、同様のペインがある
動的スプリッターに指定できるペインの最大数は、2 行 2 列です。 推奨される構成は次のとおりです。
1 行 x 2 列 : 縦棒データの場合
2 行 x 1 列: テキストまたはその他のデータの場合
2 行 x 2 列: グリッドまたはテーブル指向データの場合
スプリッターの例
MFC サンプル プログラムの多くは、直接または間接的に分割ウィンドウを使用します。 MFC General サンプル VIEWEX は、スプリッターにスプリッターを配置する方法など、静的スプリッターのいくつかの用途を示しています。
ClassWizard を使用して、分割ウィンドウを含む新しい複数ドキュメント インターフェイス (MDI) 子フレーム ウィンドウ クラスを作成することもできます。 分割ウィンドウの詳細については、「 複数のドキュメントの種類、ビュー、フレーム ウィンドウ」を参照してください。
実装で使用される用語
分割ウィンドウに固有の用語の一覧を次に示します。
CSplitterWnd
: 行または列のすべてのペイン間で共有されるウィンドウ分割コントロールとスクロール バーを提供するウィンドウ。 0 から始まる数値で行と列を指定します (最初のペインは行 = 0、列 = 0)。
ペイン: CSplitterWnd
が管理するアプリケーション専用のウインドウ。 ペインは通常、 CView クラスから派生したオブジェクトですが、適切な子ウィンドウ ID を持つ任意の CWnd オブジェクトを指定できます。
CWnd
派生オブジェクトを使用するには、CreateView
派生クラスを使用する場合と同様に、オブジェクトのRUNTIME_CLASSをCView
関数に渡します。 フレームワークでは実行時に動的な作成が使用されるため、クラスではDECLARE_DYNCREATEとIMPLEMENT_DYNCREATEを使用する必要があります。 CSplitterWnd
にはCView
クラスに固有のコードが多数ありますが、CObject::IsKindOf は常にこれらのアクションが実行される前に使用されます。
分割バー: ペインの行と列の間に配置されるコントロール。 ペインの行または列のサイズを調整するために使用できます。
分割ボックス: ペインの新しい行または列を作成するために使用できる動的な CSplitterWnd
内のコントロール。 垂直スクロール バーの上部または水平スクロール バーの左側にあります。
分割交差: 垂直分割バーと水平分割バーの交差。 ドラッグすると、ペインの行と列のサイズを同時に調整できます。
共有スクロール バー
CSplitterWnd
クラスは、共有スクロール バーもサポートしています。 これらのスクロール バー コントロールは、 CSplitterWnd
の子であり、スプリッターのさまざまなペインと共有されます。
たとえば、1 行 x 2 列のウィンドウでは、 CSplitterWnd
の作成時にWS_VSCROLLを指定できます。 Windows では、2 つのウィンドウ間で共有される特別なスクロール バー コントロールが作成されます。
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
ユーザーがスクロール バーを移動すると、WM_VSCROLLメッセージが両方のビューに送信されます。 いずれかのビューでスクロール バーの位置を設定すると、共有スクロール バーが設定されます。
共有スクロール バーは、同様のビュー オブジェクトで最も便利であることに注意してください。 分割器に異なる型のビューを混在させる場合は、スクロール位置を調整する特別なコードを記述する必要があります。 CView
スクロール バー API を使用するCWnd
派生クラスは、存在する場合は共有スクロール バーに委任されます。 CScrollView
実装は、共有スクロール バーをサポートするCView
クラスの 1 つの例です。 CView
から派生しないクラス、コントロール以外のスクロール バーに依存するクラス、または標準の Windows 実装 (CEditView
など) を使用するクラスは、CSplitterWnd
の共有スクロール バー機能では機能しません。
最小サイズ
各行には行の最小の高さがあり、各列には最小列幅があります。 この最小値により、ペインが小さすぎて完全に詳細に表示されないことが保証されます。
静的分割ウィンドウの場合、最初の最小行の高さと列の幅は 0 です。 動的分割ウィンドウの場合、最初の最小行の高さと列の幅は、関数の CSplitterWnd::Create
パラメーターによって設定されます。
これらの最小サイズは、 CSplitterWnd::SetRowInfo 関数と CSplitterWnd::SetColumnInfo 関数を使用して変更できます。
実際のサイズと理想的なサイズ
分割ウィンドウ内のペインのレイアウトは、それらを含むフレームのサイズによって異なります。 ユーザーがフレームのサイズを変更すると、CSplitterWnd
はペインの位置を変更し、なるべく収まるようにペインのサイズを変更します。
ユーザーは、行の高さと列の幅のサイズを手動で設定することも、 CSplitterWnd
クラスを使用してプログラムで理想的なサイズを設定することもできます。 実際のサイズは、理想的なサイズよりも小さいか、大きくなる可能性があります。 理想的なサイズを表示するための十分な空き領域がない場合、または分割ウィンドウの右側または下部に空き領域が多すぎる場合、Windows は実際のサイズを調整します。
カスタム コントロール
多くの関数をオーバーライドして、カスタマイズされた動作とカスタマイズされたインターフェイスを提供できます。 この最初のセットをオーバーライドして、分割ウィンドウのさまざまなグラフィカル コンポーネントの代替画像を提供できます。
virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);
virtual void OnInvertTracker(const CRect& rect);
この関数を呼び出して、共有スクロール バー コントロールを作成します。 これをオーバーライドして、スクロール バーの横に追加のコントロールを作成できます。
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);
これらの関数は、動的分割ウィンドウのロジックを実装します。 これらをオーバーライドして、より高度な分割ロジックを提供できます。
virtual void DeleteView(int row, int col);
virtual BOOL SplitRow(int cyBefore);
virtual BOOL SplitColumn(int cxBefore);
virtual void DeleteRow(int rowDelete);
virtual void DeleteColumn(int colDelete);
CView 機能
CView
クラスでは、次の大まかなコマンドを使用して、CSplitterWnd
実装に委任します。 これらのコマンドは仮想的であるため、標準の CView
実装では、 CSplitterWnd
の実装全体をリンクする必要はありません。 CView
を使用するが、CSplitterWnd
を使用しないアプリケーションの場合、CSplitterWnd
の実装はアプリケーションとリンクされません。
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
ID_NEXT_PANEまたはID_PREV_PANEが現在可能かどうかを確認します。
virtual void ActivateNext(BOOL bPrev = FALSE);
[次のペイン] または [前のペイン] コマンドを実行します。
virtual BOOL DoKeyboardSplit();
キーボード分割コマンド (通常は "ウィンドウ分割") を実行します。