重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【終了しました】教えて!goo新規会員登録

VC++2005(MFC)にてMDIアプリケーションを作成しております。

前回当サイトの質問
http://oshiete1.goo.ne.jp/qa4708537.html
にて、参照URL(http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_M …と、
回答者様のご指摘により問題解決したのですが、
このままだと、メニュー選択するとウィンドウ1とウィンドウ2が
再び現れてしまい、合計4つのウィンドウが現れることになります。
(ウィンドウ1:2個、ウィンドウ2:2個)

起動時にウィンドウ1のみ表示させる方法は自力で作成したのですが、
メニュー選択でウィンドウを一つ(ウィンドウ2)だけ
追加生成するようにし、合計2つの別々のウィンドウが現れるようにしたいのです。
下記に改良した現時点でのソースコードを記載します。
「☆☆☆追加☆☆☆」で囲まれた箇所が、上記質問URLを元に改変した
ソースコードになります。他はスケルトンです。

【呼び出し元クラス:CMDITest1App】
CMDITest1App::CMDITest1App(){ //コンストラクタ
//☆☆☆追加☆☆☆
m_WndFlg == false;
//☆☆☆追加☆☆☆
}

BOOL CMDITest1App::InitInstance(){
・・・ //スケルトン
//☆☆☆追加☆☆☆
CMultiDocTemplate* pDocTemplate2;
pDocTemplate2 = new CMultiDocTemplate(IDR_MDITest1TYPE2,
RUNTIME_CLASS(CMDITest1Doc),
RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
RUNTIME_CLASS(CMDITest1View2));
if (!pDocTemplate2)
return FALSE;
AddDocTemplate(pDocTemplate2);
m_pDocTemplate2 = pDocTemplate2;
//☆☆☆追加☆☆☆
・・・
return TRUE;
}

【オーバーライドした関数:OnFileNew()】
//☆☆☆追加☆☆☆
void CMDITest1App::OnFileNew(){
CWinApp::OnFileNew();
if( m_WndFlg == true ){ //初回起動時は生成しない
((CMainFrame*)m_pMainWnd)->OpenView( m_pDocTemplate2 );
}
m_WndFlg = true;
}
//☆☆☆追加☆☆☆

何か良い方法ございましたら、ご教授お願い致します。
また、現在MDIでのアプリケーション作成について作成手順が分からず大変苦戦しております。
何か順序を追って作成していけるような参考サイト・文献などあれば、
そちらの方もご教授頂けますと幸いです。

A 回答 (1件)

その考え方は MFCの Doc/Viewのアーキテクチャーに沿いませんよ



DocuemntとViewが一体であることが前提になります
ファイル > 新規作成 を行うと 新たなドキュメントが生成されます
このとき Viewも一緒に生成するというのが本来の姿なのです

OnFileNewから呼ばれている CFrameWindow::OpenViewを呼び出すのを止めてしまえばご希望に沿う形になるでしょう

スライダーバーのViewを表示させるために新たにメニュー項目を追加した方がいいかと思います

表示メニューの中あたりに スライダービューなどといった項目を設置
CDocumnetの派生クラスに CMDIChildWnd型のポインタ変数など準備して
これにスライダービューのオブジェクトを記憶しておくようにするなどの仕組みが必要でしょう
このメニューが選択された際に

// 現在のドキュメントを取得
CDocument* pDoc = MDIGetActive()->GetDocument();
if ( !pDoc->m_pSliderFrame ) {
  // スライダービューが未作成ならば作成
  CMultiDocTemplate* pTemp = ((CMDITest1App*)AfxGetApp())->m_pDocTemplate2;
  pDoc->m_pSliderFrame = (CMDIChildWnd*)pTemp->CreateNewFrame( pDoc, NULL );
  if ( pDoc->m_pSliderFrame ) {
    pTemp->InitialUpdateFrame( pDoc->m_pSliderFrame, pDoc );
  }
}

CMDITest1Documentのコンストラクタで
m_pSilderFrame = NULL;
を行いましょう

MDITest1Doc.hのCMDITest1Documentクラスに
CMDIChildFrame* m_pSliderFrame;
を追加します
    • good
    • 0
この回答へのお礼

すみません。Doc/Viewアーキテクチャについて理解していませんでした。。
現在、ご意見を参考にコーディング中ですが、
理解しながらなので、少し時間がかかりそうです。
ただ、今までと違い上手くいきそうな気がします。
redfox63様、二回に渡る質問に対し、ご丁寧に解説して頂きありがとうございました!

お礼日時:2009/02/13 17:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!