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によって初期化することで画面に表示できる。
実際これだけなので、簡単な話なのだが意外とネット上に資料が少ないことに驚いた。