注
次のテクニカル ノートは、最初にオンライン ドキュメントに含まれてから更新されていません。 その結果、一部の手順やトピックが古くなっているか、正しくない可能性があります。 最新情報については、オンライン ドキュメント インデックスで関心のあるトピックを検索することをお勧めします。
このメモでは、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
の子ウィンドウとして作成されます。