下記URLのサンプルコード
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_M …
を参考に、VC++2005(MFC)にてMDIアプリケーションを作成しています。
サンプルを参照にソースコードを記述し、プログラム起動時に
MDIウィンドウを生成することは出来ましたが、
これを『ツールバーからメニューを選択し、ウィンドウを出す』ように
改良したいのです。
下記に起動時にMDIウィンドウを生成するソースコードを記載します。
「☆☆☆追加☆☆☆」で囲まれた箇所が、
上記URL解説を元に自分で追加した箇所で、それ以外はスケルトンです。
解決策ご存知の方おられましたら、お手数ですがご教授お願い致します。
【呼び出し元クラス:CMDITest1App】
BOOL CMDITest1App::InitInstance(){
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション"));
LoadStdProfileSettings(4); // 標準の INI ファイルのオプションをロードします (MRU を含む)
// アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート
// はドキュメント、フレーム ウィンドウとビューを結合するために機能します。
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MDITest1TYPE,
RUNTIME_CLASS(CMDITest1Doc),
RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
RUNTIME_CLASS(CMDITest1View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
//☆☆☆追加☆☆☆
CMultiDocTemplate* pDocTemplate2;
pDocTemplate2 = new CMultiDocTemplate(IDR_MDITest1TYPE2,
RUNTIME_CLASS(CMDITest1Doc),
RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
RUNTIME_CLASS(CMDITest1View2));
if (!pDocTemplate2)
return FALSE;
AddDocTemplate(pDocTemplate2);
//☆☆☆追加☆☆☆
// メイン MDI フレーム ウィンドウを作成します。
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
delete pMainFrame;
return FALSE;
}
m_pMainWnd = pMainFrame;
// 接尾辞が存在する場合にのみ DragAcceptFiles を呼び出します。
// MDI アプリケーションでは、この呼び出しは、m_pMainWnd を設定した直後に発生しなければなりません。
// DDE、file open など標準のシェル コマンドのコマンド ラインを解析します。
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// コマンド ラインで指定されたディスパッチ コマンドです。アプリケーションが
// /RegServer、/Register、/Unregserver または /Unregister で起動された場合、False を返します。
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// メイン ウィンドウが初期化されたので、表示と更新を行います。
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
//☆☆☆追加☆☆☆
pMainFrame->OpenView(pDocTemplate2);
//☆☆☆追加☆☆☆
return TRUE;
}
【呼び出し先クラス:CMainFrame】
//☆☆☆追加☆☆☆
void CMainFrame::OpenView(CDocTemplate *pTemplate){
CDocument* pDoc = MDIGetActive()->GetActiveDocument();
CMDIChildWnd* pNewFrame = (CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc, NULL);
if( pNewFrame )
pTemplate->InitialUpdateFrame(pNewFrame, pDoc);
}
//☆☆☆追加☆☆☆
No.1ベストアンサー
- 回答日時:
OnFileNewをオーバーライドしてやればいいように思います
まず追加のテンプレートをメンバー変数に持つようにします
CMDITest1App.hの CMDITest1Appクラス定義内に
CMultiDocTemplate* m_pDocTemplate2;
を追加
CMDITest1App.cppの中で テンプレートを追加した部分で
AddDocTemplate(pDocTemplate2);
//☆☆☆追加☆☆☆
m_pDocTemplate2 = pDocTemplate2;
を追加
// ここで行うと後々面倒
//☆☆☆追加☆☆☆
// pMainFrame->OpenView(pDocTemplate2);
//☆☆☆追加☆☆☆
の部分をコメントアウト
クラスビューで CMDITest1Appを選択してプロパティウィンドウの『雷マーク』をクリック
ID_FILE_NEWを選択 COMMANDの右側をクリックして OnFileNewを追加
自動挿入されたコードを
void CMDITest1App::OnFileNew()
{
CWinApp::OnFileNew();
((CMainFrame*)m_pMainWnd)->OpenView( m_pDocTemplate2 );
}
と変更
このコードの先頭付近に元からある ファイル > 新規作成用のハンドラを修正
BEGIN_MESSAGE_MAP(CMFCTest1App, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CMFCTest1App::OnAppAbout)
// 標準のファイル基本ドキュメント コマンド
// コノ下の行をコメントアウト CWinApp::OnFileNewへは行かないようにする
//ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
// 自前の OnFileNewを使うようにする
ON_COMMAND(ID_FILE_NEW, &CMFCTest1App::OnFileNew)
END_MESSAGE_MAP()
といった手順で動作すると思いますよ
ファイル > 開く の部分に関しても同様な修正が必要でしょう
この回答への補足
ご回答ありがとうございます。
ご指摘通りにコーディングしたところ、コンパイルは通りましたが、
【呼び出し先クラス:CMainFrame】内の、
CDocument* pDoc = MDIGetActive()->GetActiveDocument();
にて、
「MDITest1.exe の 0x00413ae0 でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。」
とのエラーが出ました。
デバッグを試みたところ、OpenView関数の引数(CDocTemplate *pTemplate)に
NULLが入っているので、NULLアクセスが原因かと思われますが。。
自分でも色々調べてみますが、初心者なもので解決は難しいかと思います。
申し訳ありませんが、今一度解決策をご教授頂けませんでしょうか?
失礼しましたm_pDocTemplate2に値が代入されていなかったようです。。
修正し、正常に動作させることが出来ました。
大変助かりました。ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ゲームでは結局どっちが良いの?
-
ブラウザなどで入力された文字...
-
MFC ダイアログ→MDI風に変更
-
勝手にウィンドウが開いて止ま...
-
MFCでハンドルを取得するには
-
ラジオボタンの初期指定
-
VBAで単一ブック複数窓を閉じる...
-
ExcelVBA:フォームの最小化ボ...
-
UWSCで特定のChromeのタブをア...
-
一つ前のウィンドウをTopMost=T...
-
親ウインドウにあるOKボタンを...
-
スクロールバーについて
-
スクロールバー
-
グローバルフック?にならない(...
-
MFCアプリケーションでアイコン...
-
Console.WriteLine で表示されない
-
EXCELの最前面設定解除について
-
[VBA] UserForm を Excel の W...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
ラジオボタンの初期指定
-
VBA .Value=.Value ?
-
他のアプリケーションの終了処理
-
Excelの上下を固定したい
-
Vba LongPtrについて教えてくだ...
-
[VBA] UserForm を Excel の W...
-
作成したウインドウのサイズを...
-
「&HFFFF」「&H1A」とは?
-
Alt+P,Alt+NをPostmessageで送...
-
EnumChildWindowsの使い方(VBA)
-
MFC ダイアログ上のID取得につ...
-
ダイアログをスクロールさせるには
-
ExcelVBAでAPIを使って外部ウイ...
-
ExcelのBOOKが消えた!
-
Console.WriteLine で表示されない
おすすめ情報