テクニカル ノート 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::AddDocument
と CDocTemplate::RemoveDocument
は、そのテンプレートのドキュメントを追加または削除するための仮想メンバー関数を提供します。 CDocTemplate
は CDocument
のフレンドであるため、保護された CDocument::m_pDocTemplate
バック ポインターを、ドキュメントを作成したドキュメント テンプレートをポイントするように設定できます。
CWinApp
は、既定の OnFileOpen
の実装を処理します。これにより、すべてのドキュメント テンプレートに対してクエリが実行されます。 実装には、既に開いているドキュメントの検索と、新しいドキュメントを開くときの形式の決定が含まれます。
CDocTemplate
は、ドキュメントおよびフレームの UI バインディングを管理します。
CDocTemplate
は、名前のないドキュメントの数を保持します。
Cdocument
CDocument
は CDocTemplate
が所有します。
ドキュメントには、ドキュメントを表示中の現在開いているビュー (CView
から派生したもの) の一覧 (CPtrList
) があります。
ドキュメントでは、ビューの作成または破棄は行われませんが、作成後に相互にアタッチされます。 ドキュメントが (File/Close によって) 閉じられると、アタッチされているすべてのビューが閉じられます。 ドキュメントの最後のビューが (Window/Close によって) 閉じられると、ドキュメントが閉じられます。
CDocument::AddView
および RemoveView
インターフェイスは、ビューの一覧を維持するために使用されます。 CDocument
は CView
のフレンドであるため、CView::m_pDocument
バック ポインターを設定できます。
CFrameWnd
CFrameWnd
(フレームとも呼ばれます) は、MFC 1.0 のときと同じ役割を果たしますが、現在の CFrameWnd
クラスは新しいクラスを派生させずにさまざまな場面で使用できるように設計されています。 派生クラスの CMDIFrameWnd
と CMDIChildWnd
も強化されており、多くの標準コマンドを既に実装しています。
CFrameWnd
は、フレームのクライアント領域にウィンドウを作成する役割を担います。 通常は、フレームのクライアント領域を埋めるためのメイン ウィンドウが 1 つあります。
MDI フレーム ウィンドウの場合、クライアント領域は、すべての MDI 子フレーム ウィンドウの親となる MDICLIENT コントロールで埋められます。 SDI フレーム ウィンドウまたは MDI 子フレーム ウィンドウの場合、クライアント領域は通常、CView
から派生したウィンドウ オブジェクトで埋められます。 CSplitterWnd
の場合、ビューのクライアント領域は CSplitterWnd
ウィンドウ オブジェクトで埋められ、CView
から派生したウィンドウ オブジェクト (分割ペインごとに 1 つ) は CSplitterWnd
の子ウィンドウとして作成されます。