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。
で最終的に、
テキストがまっさらになって新規作成の状態。
このようにシングルドキュメントインターフェースは動いてる。
いやー、複雑・・・。