
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でのアプリケーション作成について作成手順が分からず大変苦戦しております。
何か順序を追って作成していけるような参考サイト・文献などあれば、
そちらの方もご教授頂けますと幸いです。
No.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;
を追加します
すみません。Doc/Viewアーキテクチャについて理解していませんでした。。
現在、ご意見を参考にコーディング中ですが、
理解しながらなので、少し時間がかかりそうです。
ただ、今までと違い上手くいきそうな気がします。
redfox63様、二回に渡る質問に対し、ご丁寧に解説して頂きありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
「&HFFFF」「&H1A」とは?
-
ダイアログをスクロールさせるには
-
皆さん、おはようございます♪ ...
-
Vba LongPtrについて教えてくだ...
-
ExcelのBOOKが消えた!
-
指定したインアクティブウィン...
-
[VBA] UserForm を Excel の W...
-
作成したウインドウのサイズを...
-
Alt+P,Alt+NをPostmessageで送...
-
Excelの上下を固定したい
-
ブック構成の保護
-
VBで外部プログラムを位置のみ...
-
最大化時のフルスクリーン
-
UWSCで特定のChromeのタブをア...
-
C#でファイル転送プログラムWin...
-
ゲームでは結局どっちが良いの?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
皆さん、おはようございます♪ ...
-
検索の画面がでなくなってしま...
-
Vba LongPtrについて教えてくだ...
-
【VB2008】 マウス操作の一時的...
-
[VBA] UserForm を Excel の W...
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
UWSCで特定のChromeのタブをア...
-
ExcelのBOOKが消えた!
-
「&HFFFF」「&H1A」とは?
-
ゲームでは結局どっちが良いの?
-
作成したウインドウのサイズを...
-
エクセルで1行目から3行目が消...
-
Console.WriteLine で表示されない
-
Alt+P,Alt+NをPostmessageで送...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報