テクニカル ノート 29: 分割ウィンドウ
ここでは、ウィンドウの分割を提供し、他のペインのウィンドウのサイズ変更を管理する MFC CSplitterWnd クラスを説明します。
分割のフォーム
CSplitterWnd は分割ペインの 2 種類のさまざまなスタイルをサポートします。
「静的分割では」、分割ウィンドウを作成する場合、ペインを作成します。ペインの順序と数は変化しません。分割バーが異なるペインのサイズを変更するために使用されます。各ペインの異なるビュー クラスを表示するために、この形式を使用できます。Visual C++ のグラフィックス エディターと Windows のファイル マネージャーは、この分割のフォームを使用するプログラムの例です。分割ウィンドウでは分割ボックスを使用しません。
「動的分割では」、 Add ペインはユーザーと非分割新しいビューが分割すると同時に作成され、破棄されます。この分割は一つのビューからユーザーが分割を開始できるように開始し、分割ボックスを表示します。分割ウィンドウは動的にビューを 1 回の方向に分割すると、新しいビュー オブジェクトを作成します。この新しいビュー オブジェクトは、新しいペインを表します。ビューを 2 回の方向でキーボード インターフェイスを使用して分割すると、分割ウィンドウは 3 個の新しいペインの 3 個の新しいビュー オブジェクトを作成します。分割がアクティブな間、ウィンドウはペイン間の分割バーとして分割ボックスが表示されます。ウィンドウは、分割ウィンドウ自体が破棄されるまでユーザーが分割を削除しますが、元のビューが残りますときに追加のビュー オブジェクトを破棄します。Microsoft Excel および Microsoft Word は動的分割のフォームを使用するアプリケーションの例です。
分割ウィンドウの Kind いずれかの作成時に分割が管理する列と行の最大数を指定します。静的分割はすべての行と列のサイズにペインを作成します。動的分割は CSplitterWnd の作成時に最初のペインが作成されます。
、静的分割に指定できるペインの最大数は 16 列で 16 行です。推奨構成は次のとおりです:
1 行 2 列: X 通常と異なるペイン
2 行 1 列: X 通常と異なるペイン
2 行 2 列: X 通常と同じようなペイン
、動的分割に指定できるペインの最大数は 2 列で 2 行です。推奨構成は次のとおりです:
1 行 2 列: X 円柱的なデータの場合
2 行 1 列: X テキストまたはそのほかのデータには
2 行 2 列: X グリッドまたはテーブルのデータをづけました方向
分割の例
MFC のサンプル プログラムの多くは、分割ウィンドウが直接的または間接的に使用します。MFC の一般的なサンプル VIEWEX を含む静的分割の複数の使用を分割に分割を配置する方法について説明します。
また、分割ウィンドウを含む新しい複数のドキュメント インターフェイス (MDI) の子フレーム ウィンドウ クラスを作成するには、 ClassWizard を使用できます。分割ウィンドウの詳細については、 複数のドキュメントの種類、ビュー、およびフレーム ウィンドウを参照してください。
実装によって使用される用語
分割ウィンドウに特定の用語のリストに示します:
CSplitterWnd:
行のすべてのペインまたは列の間で共有されるスクロール バーとペイン分割を制御するペイン。ゼロ ベースの数が複数の行と列を指定します (最初のペインは行 0 列 0 = および = です)。:ペイン
CSplitterWnd が管理するアプリケーション固有のペイン。ペインは通常 CView クラスから派生したが、適切な子ウィンドウ ID を持つ CWnd のどのオブジェクトでもかまいませんオブジェクトCViewを使用するように CWnd派生オブジェクトを使用するには、 CreateView 関数へのオブジェクトの RUNTIME_CLASS を渡します。派生クラス。クラスは、フレームワークがランタイムに動的生成を使用するため DECLARE_DYNCREATE と IMPLEMENT_DYNCREATE を使用する必要があります。CView のクラスに固有の CSplitterWnd に多くのコードがありますが、 CObject::IsKindOf はこれらの操作を実行する前に常に使用されます。
分割バー:
ペインの行と列の間にあるコントロール。ペインの行や列のサイズを調整できます。を使用する場合があります。分割ボックス:
ペインの新しい行または列を作成するために使用できる動的 CSplitterWnd のコントロール。これは、垂直スクロール バーまたは水平スクロール バーの左側の上にあります。分割の交差部分:
分割バーの垂直および水平の分割バーの交差部分。ペインの行と列のサイズを同時に調整するためにドラッグすることもできます。
共有スクロール バー
CSplitterWnd のクラスは、共有スクロール バーをサポートします。これらのスクロール バー コントロールは CSplitterWnd の子で、分割の異なるペインで共有されます。
たとえば、行 1 つ X で CSplitterWndを作成すると、 2 列のペイン、 WS_VSCROLL を指定できます。ウィンドウは、 2 種類のペインで共有される特別なスクロール バー コントロールを作成します。
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
ユーザーがスクロール バーを移動すると、 WM_VSCROLL のメッセージは、両方のビューに送信されます。いずれかのビューがスクロール バーの位置を設定すると、共有スクロール バーが設定されます。
共有スクロール バーに似たビュー オブジェクトと最も効果的であることに注意してください。分割の異なる型のビューを混在させると、スクロール位置を調整するために特別なコードを記述する必要があります。CView- 場合 CWnd のスクロール バーの API を使用する派生クラスは、共有スクロール バーに委任します。CScrollView の実装は、共有スクロール バーをサポートする CView のクラスの 1 例です。CViewのコントロール以外のスクロール バーに依存する場合、または既定のウィンドウの実装 ( CEditView)を使用するクラス派生クラス以外のクラスは CSplitterWndの共有スクロール バー機能を使用しません。
最小サイズ
各行の最小の行の高さがあり、各列に対して最小限の列の幅です。ペインが完全な詳細に示すには大きすぎる場合、この小さくないという保証されます。
静的分割ウィンドウの場合は、最初の最小の行の高さと列の幅は 0 です。動的分割ウィンドウの場合は、最初の最小の行の高さと幅は列の CSplitterWnd::Create の関数の sizeMin パラメーターによって設定されます。
CSplitterWnd::SetRowInfo と CSplitterWnd::SetColumnInfo 関数を使用してこれらの最小サイズを変更できます。
実際の対して。最適なサイズ
分割ウィンドウのペインのレイアウトが、それを含むゾーンのサイズによって決まります。、または可能収まるようにユーザーを含むゾーン、 CSplitterWnd の位置に移動とサイズ変更がペインのサイズを変更するとき。
ユーザーが手動で行の高さと列の幅のサイズを設定できますが、プログラムは CSplitterWnd のクラスを使用して理想的なサイズを設定できます。実際のサイズは、理想よりも小さくまたは場合があります。ウィンドウが最適なサイズを表示できる十分な領域がないか、分割ウィンドウの承認または下に大量の空の領域がある場合は実際のサイズを調整します。
カスタム コントロール
カスタマイズされた実行およびカスタマイズされたインターフェイスを提供する多くの関数をオーバーライドできます。分割ウィンドウのさまざまなグラフィカル コンポーネントの別のイメージを作成するには、この初期設定をオーバーライドできます。
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();
キーボード分割コマンドは、通常は 「分割する」ペイン実行します。