テクニカル ノート 25: ドキュメント、ビュー、フレームの作成

Note

次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。 結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。 最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。

このノートでは、WinApp、DocTemplate、ドキュメント、フレーム、ビューの作成と所有権の問題について説明します。

WinApp

システム内には、CWinApp オブジェクトが 1 つあります。

これは、フレームワークによる WinMain の内部実装によって静的に構築および初期化されています。 これを活用するには、CWinApp から派生する必要があります (例外: MFC 拡張 DLL では、CWinApp インスタンスを設定しないでください。初期化は代わりに DllMain で行われます)。

この 1 つの CWinApp オブジェクトは、ドキュメント テンプレートの一覧 (CPtrList) を所有しています。 アプリケーションごとに 1 つ以上のドキュメント テンプレートがあります。 DocTemplate は、通常、CWinApp::InitInstance 内にあるリソース ファイル (つまり、文字列の配列) から読み込まれます。

pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);

AddDocTemplate(pTemplate);

この 1 つの CWinApp オブジェクトは、アプリケーション内のすべてのフレーム ウィンドウを所有しています。 アプリケーションのメイン フレーム ウィンドウは CWinApp::m_pMainWnd に格納されている必要があります。通常、AppWizard でこれを実行しない場合は、InitInstance の実装で m_pMainWnd を設定します。 シングル ドキュメント インターフェイス (SDI) の場合は、アプリケーションのメイン フレーム ウィンドウおよび唯一のドキュメント フレーム ウィンドウとして機能する 1 つの CFrameWnd を使用します。 マルチ ドキュメント インターフェイス (MDI) の場合は、すべての子 CFrameWnd を含むアプリケーションのメイン フレーム ウィンドウとして機能する MDI フレーム (クラス CMDIFrameWnd) を使用します。 それぞれの子ウィンドウはクラス CMDIChildWnd (CFrameWnd から派生したもの) に属し、多く使用される可能性のあるドキュメント フレーム ウィンドウの 1 つとして機能します。

DocTemplate

CDocTemplate は、ドキュメントを作成および管理します。 これは、作成したドキュメントを所有します。 アプリケーションで使用する方法が、次に説明するリソースベースのものである場合、CDocTemplate から派生する必要はありません。

SDI アプリケーションの場合、クラス CSingleDocTemplate は 1 つの開いているドキュメントを追跡します。 MDI アプリケーションの場合、クラス CMultiDocTemplate は、そのテンプレートから作成された現在開いているすべてのドキュメントのリスト (CPtrList) を保持します。 CDocTemplate::AddDocumentCDocTemplate::RemoveDocument は、そのテンプレートのドキュメントを追加または削除するための仮想メンバー関数を提供します。 CDocTemplateCDocument のフレンドであるため、保護された CDocument::m_pDocTemplate バック ポインターを、ドキュメントを作成したドキュメント テンプレートをポイントするように設定できます。

CWinApp は、既定の OnFileOpen の実装を処理します。これにより、すべてのドキュメント テンプレートに対してクエリが実行されます。 実装には、既に開いているドキュメントの検索と、新しいドキュメントを開くときの形式の決定が含まれます。

CDocTemplate は、ドキュメントおよびフレームの UI バインディングを管理します。

CDocTemplate は、名前のないドキュメントの数を保持します。

Cdocument

CDocumentCDocTemplate が所有します。

ドキュメントには、ドキュメントを表示中の現在開いているビュー (CView から派生したもの) の一覧 (CPtrList) があります。

ドキュメントでは、ビューの作成または破棄は行われませんが、作成後に相互にアタッチされます。 ドキュメントが (File/Close によって) 閉じられると、アタッチされているすべてのビューが閉じられます。 ドキュメントの最後のビューが (Window/Close によって) 閉じられると、ドキュメントが閉じられます。

CDocument::AddView および RemoveView インターフェイスは、ビューの一覧を維持するために使用されます。 CDocumentCView のフレンドであるため、CView::m_pDocument バック ポインターを設定できます。

CFrameWnd

CFrameWnd (フレームとも呼ばれます) は、MFC 1.0 のときと同じ役割を果たしますが、現在の CFrameWnd クラスは新しいクラスを派生させずにさまざまな場面で使用できるように設計されています。 派生クラスの CMDIFrameWndCMDIChildWnd も強化されており、多くの標準コマンドを既に実装しています。

CFrameWnd は、フレームのクライアント領域にウィンドウを作成する役割を担います。 通常は、フレームのクライアント領域を埋めるためのメイン ウィンドウが 1 つあります。

MDI フレーム ウィンドウの場合、クライアント領域は、すべての MDI 子フレーム ウィンドウの親となる MDICLIENT コントロールで埋められます。 SDI フレーム ウィンドウまたは MDI 子フレーム ウィンドウの場合、クライアント領域は通常、CView から派生したウィンドウ オブジェクトで埋められます。 CSplitterWnd の場合、ビューのクライアント領域は CSplitterWnd ウィンドウ オブジェクトで埋められ、CView から派生したウィンドウ オブジェクト (分割ペインごとに 1 つ) は CSplitterWnd の子ウィンドウとして作成されます。

関連項目

番号順テクニカル ノート
カテゴリ別テクニカル ノート