CWinApp::AddDocTemplate

ここからは、SDIアプリケーションについて扱っていく。

ドキュメント/ビュー アーキテクチャ | Microsoft Docs
MFC編 - ドキュメント・ビューの基本

MFCアプリケーション
MFCアプリケーション

MFCアプリケーションプロジェクトを選択。

現在のプロジェクト
現在のプロジェクト

現在こうなっているが、

シングルドキュメント
シングルドキュメント

このようなシングルドキュメントの設定にする。

複合ドキュメントなし
複合ドキュメントなし

複合ドキュメントはなし。

ドキュメントテンプレート文字列
ドキュメントテンプレート文字列

この辺はそのまま。

データベースサポートなし
データベースサポートなし

これもなし。

ユーザーインターフェース
ユーザーインターフェース

ここは重要。このように設定する。
ステータスバー、ツールバーは扱いません。

高度な機能なし
高度な機能なし

高度な機能も全部オフにする。

生成されたクラス
生成されたクラス

生成されたクラスもこんな感じ。
これでプロジェクトを作成。

ソリューションエクスプローラ
ソリューションエクスプローラ

このようにたくさんのファイルが追加される。
ビルドして実行すると、

そのままビルド実行
そのままビルド実行

このような、フレームウィンドウの中に、メニューと、ビュー(クライアント領域)の付いたウィンドウが表示される。

CWinApp_.cppで、

レジストリキー設定や、プロファイルのロードとかは置いといて、重要なのは、CSingleDocTemplateオブジェクトを作成し、できたpDocTemplateをAddDocTemplateに渡しているところである。

ここで、ドキュメントCWinApp_Doc、フレームウィンドウCMainFrame、ビューCWinApp_View、これらを結合するシングルドキュメントテンプレートCSingleDocTemplateを作成している。また、IDR_MAINFRAMEだが、これも必要。メニューやアイコンなどのリソース情報のIDだから。

ここで、CWinApp_にこのテンプレートを追加している。

CWinApp::AddDocTemplate (MFC)

で、このAddDocTemplateがないと、

CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CWinApp_Doc),
		RUNTIME_CLASS(CMainFrame),       // メイン SDI フレーム ウィンドウ
		RUNTIME_CLASS(CWinApp_View));
	if (!pDocTemplate)
		return FALSE;
	//AddDocTemplate(pDocTemplate);

後の処理でウィンドウ作成に失敗して、アプリが終了してしまう。
で、この部分がどうなっているか調べてみる。

pDocTemplate
pDocTemplate

pDocTemplateは生成されている。
で、この先は飛ばして、

ProcessShellCommand
ProcessShellCommand

ProcessShellCommand、ここがどうなるか。

FALSEになってしまう
FALSEになってしまう

AddDocTemplateをコメントしてるとFALSEになってしまう。

終了
終了

結果、終了してしまう。

もう一度ここまでいく
もう一度ここまでいく

そこで、もう一度デバッグ実行して、ここまで来たら、

ステップイン
ステップイン

ステップインする。

ここに入る
ここに入る

すると、ここに入ってくる。

ステップオーバー
ステップオーバー

ここからはステップオーバー。

m_pMainWndはNULL
m_pMainWndはNULL

ここまででm_pMainWndはNULLなので、

ブレークポイント
ブレークポイント

ブレークポイント貼っておいてさらに中をステップインで調べる。

この先行くと
この先行くと

この先は、

ここに出る
ここに出る

ここに出る。
ステップオーバーすると、

ここで終わり
ここで終わり

ここで終わっちゃう。

ここに戻ってくる
ここに戻ってくる

で、もう一回ステップインすると、

ここに入ってくる
ここに入ってくる

ここに入ってくる。
CCmdTarget::OnCmdMsgに来た。
ステップオーバーしていくと、

こういうところを通る
こういうところを通る

こういうところを通っていく。

終わってしまう
終わってしまう

でも終わってしまう。

NULLのまま
NULLのまま

m_pMainWndはNULLのまま。
そこで、

AddDocTemplate
AddDocTemplate

もう一度AddDocTemplateを有効にする。

ここ来たら
ここ来たら

ここ来たら、ステップイン。

いったん飛ばして
いったん飛ばして

いったん飛ばして、

もう一回ステップイン
もう一回ステップイン

ここでもう一回ステップイン。

ここに来る
ここに来る

ここに来る。
足跡として、

ブレークポイント
ブレークポイント

ブレークポイント貼って、ここをステップオーバーしていく。
ここからの判断は難しいが、

ここをステップイン
ここをステップイン

ここをステップインする。

ここに来る
ここに来る

ここに来る。
ステップオーバーしていく。

難しい
難しい

これはなかなか難しい。
ここでステップイン。

ここに出る
ここに出る

ここに出る。

さらにステップイン
さらにステップイン

m_pDocManagerはNULLでないので、ここまでいけるので、さらにステップイン。

ここに到達
ここに到達

ここに到達するのでさらにステップオーバー。

ここまでくる
ここまでくる

ここまでくるので、さらにステップイン。

ここにくる
ここにくる

ここにくるので、さらにステップオーバーしていく。

CreateNewDocument
CreateNewDocument

CreateNewDocumentなんてのもあるけど、

pFrameがNULL
pFrameがNULL

pFrameがNULL、ここがポイント。

CreateNewFrame
CreateNewFrame

CreateNewFrame、ここでフレームを作っている。

ブレークポイント
ブレークポイント

ここにブレークポイント貼ってさらに中を見に行こう。

中はこうなっている
中はこうなっている

中はこうなっている。さらにステップオーバー。

オブジェクト作成
オブジェクト作成

これはオブジェクトの作成であって、ウィンドウの作成ではない。

LoadFrame
LoadFrame

LoadFrameだ。この中っぽい。

中はこう
中はこう

中はこう。下に行くと、

Create
Create

ついにCreateを見つけた!!
ここでCFrameWndができると、

m_pMainWndにセットされる
m_pMainWndにセットされる

m_pMainWndにセットされる。

ここが
ここが

ここはFALSEにならない。

ここはTRUE
ここはTRUE

ここはTRUEになり、

結果ここにきて
結果ここにきて

結果、ここにきて、

ウィンドウ表示
ウィンドウ表示

ウィンドウが表示される。
長かった・・・。

Sample/mfc/CWinApp/AddDocTemplate/src/CWinApp_ at master · bg1bgst333/Sample · GitHub