注
次のテクニカル ノートは、最初にオンライン ドキュメントに含まれてから更新されていません。 その結果、一部の手順やトピックが古くなっているか、正しくない可能性があります。 最新情報については、オンライン ドキュメント インデックスで関心のあるトピックを検索することをお勧めします。
このメモでは、WinApps、DocTemplates、ドキュメント、フレーム、ビューの作成と所有権に関する問題について説明します。
WinApp
システムには 1 つの CWinApp オブジェクトがあります。
フレームワークの 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 にm_pMainWndを許可していない場合は、InitInstance実装で設定します。 単一ドキュメント インターフェイス (SDI) の場合、これはメイン アプリケーション フレーム ウィンドウとして機能する 1 つの CFrameWnd と、唯一のドキュメント フレーム ウィンドウです。 複数のドキュメント インターフェイス (MDI) の場合、これは、すべての子CFrameWndを含むメイン アプリケーション フレーム ウィンドウとして機能する MDI-Frame (クラス CMDIFrameWnd) です。 各子ウィンドウはクラス CMDIChildWnd ( CFrameWnd から派生) であり、潜在的に多くのドキュメント フレーム ウィンドウの 1 つとして機能します。
DocTemplates
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によって所有されます。
ドキュメントには、ドキュメント (CPtrList) を表示している現在開いているビュー (CViewから派生) の一覧があります。
ドキュメントはビューを作成または破棄しませんが、作成後に相互に添付されます。 ドキュメントを閉じる (つまり、ファイル/閉じる) と、アタッチされているすべてのビューが閉じられます。 ドキュメントの最後のビューが閉じられると (つまり、ウィンドウ/閉じる)、ドキュメントは閉じられます。
CDocument::AddView、RemoveViewインターフェイスは、ビュー リストを維持するために使用されます。
CDocument は CView の友人であるため、 CView::m_pDocument 戻るポインターを設定できます。
CFrameWnd
CFrameWnd (フレームとも呼ばれます) は MFC 1.0 と同じ役割を果たしますが、CFrameWnd クラスは多くの場合、新しいクラスを派生させることなく使用するように設計されています。 派生クラス CMDIFrameWnd と CMDIChildWnd も拡張されているため、多くの標準コマンドが既に実装されています。
CFrameWndは、フレームのクライアント領域にウィンドウを作成します。 通常は、フレームのクライアント領域に 1 つのメイン ウィンドウが表示されます。
MDI-Frame ウィンドウの場合、クライアント領域には MDICLIENT コントロールが格納されます。このコントロールは、MDI-Child フレーム ウィンドウの親になります。 SDI-Frame ウィンドウまたは MDI-Child フレーム ウィンドウの場合、通常、クライアント領域には CView派生ウィンドウ オブジェクトが格納されます。
CSplitterWndの場合、ビューのクライアント領域はCSplitterWnd ウィンドウ オブジェクトで塗りつぶされ、CView派生ウィンドウ オブジェクト (分割ペインごとに 1 つ) がCSplitterWndの子ウィンドウとして作成されます。