テクニカル ノート 25: ドキュメント、ビュー、フレームの作成
注意
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。 結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。 最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
このメモでは、WinApps、DocTemplates、Documents、Frames、Views の作成と所有権の問題について説明します。
WinApp
システムに CWinApp 1 つのオブジェクトがあります。
これは、フレームワークの の内部実装によって静的に構築および初期化されます WinMain 。 から派生して有用な操作を行う必要があります (例外: MFC 拡張 DLL では、代わりにインスタンスの初期化 CWinAppCWinApp— が行われる DllMain 必要はありません)。
1 CWinApp つのオブジェクトは、ドキュメント テンプレートの一覧 () を所有しています CPtrList 。 アプリケーションごとに 1 つ以上のドキュメント テンプレートがあります。 DocTemplates は通常、 のリソース ファイル (文字列配列) から読み込まれます CWinApp::InitInstance 。
pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);
AddDocTemplate(pTemplate);
1 つの CWinApp オブジェクトは、アプリケーション内のすべてのフレーム ウィンドウを所有します。 アプリケーションのメイン フレーム ウィンドウは に格納する必要があります。通常は CWinApp::m_pMainWnd 、AppWizard に設定しない場合は、実装で CWinApp::m_pMainWnd を InitInstance 設定します。 単一ドキュメント インターフェイス (SDI) の場合、これはメイン アプリケーション フレーム ウィンドウと唯一のドキュメント フレーム ウィンドウ CFrameWnd として機能します。 複数のドキュメント インターフェイス (MDI) の場合、これはすべての子 MDI-Frameを含むメイン アプリケーション フレーム ウィンドウとして機能するアプリケーション (クラス CMDIFrameWnd ) CFrameWnd です。 各子ウィンドウは クラス (から派生) であり、多くのドキュメント フレーム ウィンドウの CMDIChildWndCFrameWnd 1 つとして機能します。
DocTemplates
は CDocTemplate 、ドキュメントの作成者およびマネージャーです。 作成するドキュメントを所有します。 アプリケーションで以下で説明するリソースベースのアプローチを使用する場合は、 から派生する必要は CDocTemplate "。"
SDI アプリケーションの場合、 クラスは開いている CSingleDocTemplate ドキュメントを 1 つ追跡します。 MDI アプリケーションの場合、 クラスは、そのテンプレートから作成された現在開いているすべてのドキュメントのリスト CMultiDocTemplateCPtrList (a) を保持します。 CDocTemplate::AddDocument テンプレート CDocTemplate::RemoveDocument に対してドキュメントを追加または削除するための仮想メンバー関数を提供します。 CDocTemplate は のフレンドなので、ドキュメントを作成したドキュメント テンプレートを指し示す保護された戻るポインター CDocumentCDocument::m_pDocTemplate を設定できます。
CWinApp は既定の OnFileOpen 実装を処理します。この場合、すべてのドキュメント テンプレートに対してクエリが実行されます。 実装には、既に開いているドキュメントの探し、新しいドキュメントを開く形式の決定が含まれます。
CDocTemplate は、ドキュメントとフレームの UI バインディングを管理します。
CDocTemplate は、名前のないドキュメントの数を保持します。
CDocument
は CDocument によって所有されます CDocTemplate 。
ドキュメントには、ドキュメント () を表示している現在開いているビュー (から派生 CView ) の一覧があります CPtrList 。
ドキュメントはビューを作成または破棄するのではなく、作成後に互いにアタッチされます。 ドキュメントが閉じている場合 (つまり、ファイル/閉じる)、アタッチされているビューはすべて閉じられます。 ドキュメントの最後のビューが閉じる (つまり、ウィンドウ/閉じる) と、ドキュメントは閉じられます。
インターフェイス CDocument::AddView は RemoveView 、ビュー リストを維持するために使用されます。 CDocument は のフレンド CView なので、戻るポインターを CView::m_pDocument 設定できます。
CFrameWnd
(フレームとも呼ばれる) は MFC 1.0 と同じ役割を果たしますが、現在、 クラスは多くの場合、新しいクラスを派生させずに使用するように CFrameWndCFrameWnd 設計されています。 派生クラス と も CMDIFrameWnd 強化 CMDIChildWnd され、多くの標準コマンドが既に実装されています。
は CFrameWnd 、フレームのクライアント領域にウィンドウを作成する必要があります。 通常、フレームのクライアント領域を埋め込むメイン ウィンドウが 1 つ表示されます。
新しいMDI-Frameの場合、クライアント領域には MDICLIENT コントロールが塗りつぶされます。このコントロールは、新しいフレーム ウィンドウMDI-Child親になります。 通常、SDI-FrameウィンドウまたはMDI-Childウィンドウの場合、クライアント領域には通常、派生ウィンドウ CView オブジェクトが表示されます。 の場合、ビューのクライアント領域にはウィンドウ オブジェクトが塗りつぶされ、派生ウィンドウ オブジェクト (分割ウィンドウごとに 1 つ) が の子 CSplitterWndCSplitterWndCView ウィンドウとして作成されます CSplitterWnd 。