MDIウインドウを明示的に作成する

[戻る]
sizuku 2007/10/05(金) 11:01:35
現在、MFCでMDIアプリケーションを作成しています。
トップメニューのファイルから新規作成を選ぶと
新しいMDIウインドウを作成することができますが、
このウインドウの作成をプログラムから明示的に行いたいと考えています。
現状では、WM_COMMANDをID_FILE_NEWとしてポストするという形で実装していますが、
この他に何か方法はあるのでしょうか。

たいちう 2007/10/05(金) 11:37:47
CWinApp::OnFileNew() で良いのでは?
protectedだから、呼び出す場所によっては、スコープを広げる必要があるけど。

玲音 (st.lain) 2007/10/05(金) 11:44:46
CDocTemplate::CreateNewFrame()を明示的に呼び出す、ということカナ。
既存のドキュメントに対して新規にフレームを割り当てるなら以下のように
すればよかったかと思います。
(ドキュメントが異なる場合は、CreateNewDocument()が必要のはず)

CDocument* pDoc = static_cast<CHogeApp*>(AfxGetApp())->GetDocument();
ASSERT(pDoc != NULL);

CChildFrame* pChild = static_cast<CChildFrame*>(pDoc->GetDocTemplate()-
>CreateNewFrame(pDoc, NULL));

たいちうさんの書かれているとおり、OnFileNew()で十分だと思っています。

玲音 (st.lain) 2007/10/05(金) 13:52:25
追加補足&訂正です。

> CDocument* pDoc = static_cast<CHogeApp*>(AfxGetApp())->GetDocument();
普段、シングルドキュメントに対するマルチビューをやっていたので、
勘違いしていました。

CDocument自体はCWinApp派生から直接持ってくることはできません。
追加されたドキュメントテンプレートを回すなり、(存在するなら)アクティブな
ビューから直接ドキュメントを持ってくるなり、して下さい。

# 結局、ドキュメントテンプレートのCreateNewFrame()をコールするだけならば
# CDocument*が不必要ですが。

CWinApp::InitInstance()でドキュメントテンプレートを追加するので、その
ポインタをメンバとして再利用するのも手かと思います。
(その場合は、メモリ違反にだけは注意してください)

sizuku 2007/10/05(金) 19:21:43
[[解決]]
レスありがとうございます。
OnFileNewでいこうかと思いますが、
ドキュメントテンプレートの方も面白そうなので試してみたいと思います。
ありがとうございました。

古いスレッドには追加発言できません。