CDocument・CView・CFrameWndの関係

 AppWizardを利用してSDIアプリケーションを作るのであれば難しくないが、ダイアログベースからSDIウィンドウを呼び出すのは結構ややこしい。実際にやってみるとそんなに難しい話ではないのだが、忘れると困るのでここに書いておく。
 
 まずSDIの窓を構築するためにCSingleDocTemplateクラスを利用する。このクラスはCDocument・CView・CFrameWndの関連付けを行う。以下のような感じで初期化部分に記述する。


m_pSdt=new CSingleDocTemplate(
  IDR_COMDUMPWND,
  RUNTIME_CLASS(CComDumpDocument),
  RUNTIME_CLASS(CComFrameWnd),
  RUNTIME_CLASS(CComWindowView));

 
 1番目の引数は対象のSDIウィンドウに関連付けるリソースID、この名前と同名の文字列・アイコンを用意すると自動的にフレームのアイコン・タイトルとして関連付けられる。RUNTIME_CLASSマクロはCRuntimeClass構造体からそれぞれのクラスのアドレスを得る。これによって、CSingleDocTemplateオブジェクトが構築される。
 
 次にフレームを呼び出す時には以下のような手順で呼び出す。
 まずフレームに関連付けるドキュメントを生成する。
 ここの例ではCComDumpDocumentがドキュメントクラスとして関連付けられているので、

CDumpDocument* m_pDumpDocument=(CComDumpDocument*)m_pSdt->CreateNewDocument();

 
 これによって新規ドキュメントのアドレスがm_pDumpDocumentに代入される。
 既存のドキュメントを表示させたい場合、独自にコードを書けばよい。
 
 次にフレームの表示を行う。

CFrameWnd* pFrame=m_pSdt->CreateNewFrame(m_pDumpDocument,NULL);
if(pFrame==NULL){
  AfxMessageBox("フレームウィンドウの作成に失敗");
}
m_pSdt->InitialUpdateFrame(pFrame,NULL,TRUE);

 
 新しいフレームはCreateNewFrameによって呼び出される、呼び出されたフレームはInitialUpdateFrameによって初期化することで画面に表示できる。
 
 実際これだけなので、簡単な話なのだが意外とネット上に資料が少ないことに驚いた。