テクニカル ノート 25: ドキュメント、ビュー、フレームの作成
更新 : 2007 年 11 月
メモ : |
---|
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。 |
ここでは、ウィンドウ アプリケーション、ドキュメント テンプレート、ドキュメント、フレーム、ビューの作成と、作成されたオブジェクトの所有権について説明します。
WinApp
システムには CWinApp オブジェクトが 1 つ存在します。
このオブジェクトは、フレームワーク内部の WinMain から静的に構築され初期化されます。実際になんらかの作業を行うアプリケーションを作成するには、CWinApp からオブジェクトを派生させます。ただし、拡張ダイナミック リンク ライブラリ (DLL: Dynamic Link Library) は例外的に CWinApp インスタンスを作成しません。初期化は DllMain で行われます。
CWinApp オブジェクトは、ドキュメント テンプレートのリスト (CPtrList) を所有します。各アプリケーションに 1 つ以上のドキュメント テンプレートがあります。ドキュメント テンプレートは、通常、CWinApp::InitInstance メンバ関数によってリソース ファイル (つまり、文字列の配列) から読み込まれます。
pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);
AddDocTemplate(pTemplate);
CWinApp オブジェクトは、アプリケーション内のすべてのフレーム ウィンドウを所有します。アプリケーションのメイン フレーム ウィンドウは CWinApp::m_pMainWnd に格納する必要があります。通常、AppWizard を使わない場合は、InitInstance で m_pMainWnd を設定します。シングル ドキュメント インターフェイス (SDI: Single Document Interface) では、このウィンドウは単一の CFrameWnd であり、メイン アプリケーション フレーム ウィンドウとして機能すると同時に唯一のドキュメント フレーム ウィンドウとしても機能します。マルチ ドキュメント インターフェイス (MDI: Multiple Document Interface) では、このウィンドウは MDI フレーム (CMDIFrameWnd クラス) であり、アプリケーションのメイン フレーム ウィンドウとして動作し、すべての子 CFrameWnd の親になります。それぞれの子ウィンドウは、CMDIChildWnd クラス (CFrameWnd の派生クラス) のオブジェクトであり、多くのドキュメント フレーム ウィンドウの 1 つとして動作します。
DocTemplates
CDocTemplate は、ドキュメントを作成して管理します。また、作成したドキュメントを所有します。アプリケーションが、次に説明するようにリソース ベースで処理を行う場合、ドキュメント テンプレートを CDocTemplate から派生する必要はありません。
SDI アプリケーションの場合は、CSingleDocTemplate クラスが、開いている単一のドキュメントを管理します。MDI アプリケーションでは、CMultiDocTemplate クラスが、テンプレートから作成されて現在開いているすべてのドキュメントのリスト (CPtrList) を管理します。CDocTemplate::AddDocument と CDocTemplate::RemoveDocument は、テンプレートに対してドキュメントを追加または削除するための仮想メンバ関数を提供します。CDocTemplate は CDocument のフレンド クラスなので、プロテクト メンバの CDocument::m_pDocTemplate バック ポインタが、ドキュメントの作成元であるドキュメント テンプレートを指すように設定できます。
CWinApp は、すべてのドキュメント テンプレートを順次問い合わせる既定の OnFileOpen を処理します。さらに、OnFileOpen には、既に開いているドキュメントを探したり、新しいドキュメントをどの形式開くかを決める機能も含まれています。
CDocTemplate は、ドキュメントとフレームを結び付ける UI を管理します。
CDocTemplate は、名前を付けられていないドキュメントの数を保持します。
CDocument
CDocument は、CDocTemplate が所有します。
ドキュメントは、現在開いていて、そのドキュメント自体を表示しているすべてのビュー (CView からの派生クラス) のリスト (CPtrList) を保持しています。
ドキュメントは、ビューを作成したり破棄したりはしませんが、作成された後はビューに関連付けられます。ドキュメントを ([ファイル] メニューの [閉じる] などで) 閉じると、関連付けられているすべてのビューも閉じます。また、ドキュメントを表示している最後のビューを ([ウィンドウ] メニューの [閉じる] などで) 閉じると、ドキュメントも閉じます。
CDocument::AddView、RemoveView インターフェイスは、ビュー リストの保守に使われます。CDocument は、CView のフレンド クラスなので、CView::m_pDocument バック ポインタを設定できます。
CFrameWnd
CFrameWnd (フレーム) の役割は MFC (Microsoft Foundation Class) 1.0 のときと変わりませんが、現在の CFrameWnd クラスは、新しいクラスを派生しなくても使えるようにデザインされています。派生クラス CMDIFrameWnd と CMDIChildWnd も拡張されていて、多くの標準コマンドが既に実装されています。
CFrameWnd は、フレームのクライアント領域にウィンドウを作成します。通常は、フレームのクライアント領域には 1 つのメイン ウィンドウが入ります。
MDI フレーム ウィンドウでは、クライアント領域には、すべての MDI の子フレーム ウィンドウの親である MDICLIENT コントロールが入ります。SDI フレーム ウィンドウや MDI の子フレーム ウィンドウのクライアント領域には、通常 CView の派生ウィンドウ オブジェクトが入ります。CSplitterWnd の場合は、ビューのクライアント領域には、CSplitterWnd ウィンドウ オブジェクトが入り、CView 派生ウィンドウ オブジェクト (分割ペインごとに 1 つ) が CSplitterWnd の子ウィンドウとして作成されます。