CSingleDocTemplateは、シングルドキュメントインターフェース用のドキュメントテンプレート。
CSingleDocTemplate クラス | Microsoft Docs

MFCアプリケーションで、

現在のプロジェクト設定はそのまま。

アプリケーションの種類も前回と同様。

複合ドキュメントサポートもなし。

ドキュメントテンプレート文字列もそのまま。

データベースサポートなし。
ユーザーインターフェース機能もこうする。

高度な機能も何もつけない。

生成されたクラスで、ビューの基本クラスだけCEditViewに変更する。

このようにファイルが追加される。
このCSingleDocTemplateがどのようにシングルドキュメントを実現しているか調べてみる。
まず、ここにブレークポイントを仕込む。
デバッグ実行すると、

ここに来るわけだが、RUNTIME_CLASSというマクロ、

こうなっていて、

インスタンスにしてCRuntimeClassポインタにしてる(?)みたいだがよくわからない。
詳細はCRuntimeClassあたりでいずれ。
最初に戻って、ステップインでどうなるか。

newのところに入ってくるけど、ここは飛ばして、

ここからもう一度ステップイン。

ようやくコンストラクタに入れた。

やはりCRuntimeClassのポインタなので、インスタンス作られて渡されてるのかな。
で、m_pOnlyDocがここではNULLに初期化されてる。

この時点ではまだNULL。
ということは、どこかでここにオブジェクトポインタが入る。

じゃあm_pOnlyDocで検索してみよう。

こんな感じで検索結果が出てきたので、出てきた場所すべてにブレークポイントを貼る。
こんな感じで。

ここに来たら、続行。

まあ、ここに来るよね。
その次は、

GetFirstDocPosition、最初のドキュメントの位置を取得か。
m_pOnlyDocはNULLなので、NULLを返す模様。

AssertValid、ここはそのまま通りそう。

またここだ。

これも、またここだ。

2回ずつ訪れた後、ようやく新しい場所、OpenDocumentFileに着く。

この時点では、m_pOnlyDocはNULLなので、

ここに来る。
ここでステップインするはずが、間違えてステップオーバーしてしまったせいか、

どこか途中で引っかかったみたい。

ここで偶然にもpDocをもらって、m_pOnlyDocに格納している。
で、ここをステップアウトなりで抜けると、

なんとCreateNewDocumentの中のAddDocumentから抜けた状態だったのがわかる。
このあとはpDocumentを返すのか。

pDocumentが返される。

そのまま行くと、

pFrameの生成に行く。フレームよりドキュメントが先だったのね。

さらに先に進むとOnNewDocumentがある。
まあでも、

最終的にはここにたどり着く。
外へ出ると、

ここに出る。
さらに外へ出ると、

OnFileNewの外に出る。

CEditViewに変更したので、最終的にこのような編集可能なビューになっている。
文字列"ABCDE"を入力した段階で、

新規作成を選択。

そうすると、ここに来るが、m_pOnlyDocはもうNULLではないので、

今度はこちらに来る。
SaveModifiedは更新を保存するのかな。
続行すると、

メッセージボックスが出てくるので、いいえを選択。

中を見たらわかったけど、保存して成功でも、保存しなくても、TRUEなのか。

それでここに来ると。
で、このあとにOnNewDocumentがあったと思うが、

何してるのかとおもったら、CEditViewにNULLをセットして、テキストをまっさらに。

出てくるとこう。

InitialUpdateFrameで更新。

外に出るとOnFileNew。
で最終的に、

テキストがまっさらになって新規作成の状態。
このようにシングルドキュメントインターフェースは動いてる。
いやー、複雑・・・。


