ここからは、SDIアプリケーションについて扱っていく。
ドキュメント/ビュー アーキテクチャ | Microsoft Docs
MFC編 - ドキュメント・ビューの基本
MFCアプリケーションプロジェクトを選択。
現在こうなっているが、
このようなシングルドキュメントの設定にする。
複合ドキュメントはなし。
この辺はそのまま。
これもなし。
ここは重要。このように設定する。
ステータスバー、ツールバーは扱いません。
高度な機能も全部オフにする。
生成されたクラスもこんな感じ。
これでプロジェクトを作成。
このようにたくさんのファイルが追加される。
ビルドして実行すると、
このような、フレームウィンドウの中に、メニューと、ビュー(クライアント領域)の付いたウィンドウが表示される。
CWinApp_.cppで、
レジストリキー設定や、プロファイルのロードとかは置いといて、重要なのは、CSingleDocTemplateオブジェクトを作成し、できたpDocTemplateをAddDocTemplateに渡しているところである。
ここで、ドキュメントCWinApp_Doc、フレームウィンドウCMainFrame、ビューCWinApp_View、これらを結合するシングルドキュメントテンプレートCSingleDocTemplateを作成している。また、IDR_MAINFRAMEだが、これも必要。メニューやアイコンなどのリソース情報のIDだから。
ここで、CWinApp_にこのテンプレートを追加している。
で、この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は生成されている。
で、この先は飛ばして、
ProcessShellCommand、ここがどうなるか。
AddDocTemplateをコメントしてるとFALSEになってしまう。
結果、終了してしまう。
そこで、もう一度デバッグ実行して、ここまで来たら、
ステップインする。
すると、ここに入ってくる。
ここからはステップオーバー。
ここまででm_pMainWndはNULLなので、
ブレークポイント貼っておいてさらに中をステップインで調べる。
この先は、
ここに出る。
ステップオーバーすると、
ここで終わっちゃう。
で、もう一回ステップインすると、
ここに入ってくる。
CCmdTarget::OnCmdMsgに来た。
ステップオーバーしていくと、
こういうところを通っていく。
でも終わってしまう。
m_pMainWndはNULLのまま。
そこで、
もう一度AddDocTemplateを有効にする。
ここ来たら、ステップイン。
いったん飛ばして、
ここでもう一回ステップイン。
ここに来る。
足跡として、
ブレークポイント貼って、ここをステップオーバーしていく。
ここからの判断は難しいが、
ここをステップインする。
ここに来る。
ステップオーバーしていく。
これはなかなか難しい。
ここでステップイン。
ここに出る。
m_pDocManagerはNULLでないので、ここまでいけるので、さらにステップイン。
ここに到達するのでさらにステップオーバー。
ここまでくるので、さらにステップイン。
ここにくるので、さらにステップオーバーしていく。
CreateNewDocumentなんてのもあるけど、
pFrameがNULL、ここがポイント。
CreateNewFrame、ここでフレームを作っている。
ここにブレークポイント貼ってさらに中を見に行こう。
中はこうなっている。さらにステップオーバー。
これはオブジェクトの作成であって、ウィンドウの作成ではない。
LoadFrameだ。この中っぽい。
中はこう。下に行くと、
ついにCreateを見つけた!!
ここでCFrameWndができると、
m_pMainWndにセットされる。
ここはFALSEにならない。
ここはTRUEになり、
結果、ここにきて、
ウィンドウが表示される。
長かった・・・。
Sample/mfc/CWinApp/AddDocTemplate/src/CWinApp_ at master · bg1bgst333/Sample · GitHub