CSingleDocTemplate

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

CSingleDocTemplate クラス | Microsoft Docs

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

MFCアプリケーションで、

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

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

アプリケーションの種類
アプリケーションの種類

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

複合ドキュメントサポート
複合ドキュメントサポート

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

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

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

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

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

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

ユーザーインターフェース機能もこうする。

高度な機能
高度な機能

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

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

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

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

このようにファイルが追加される。

このCSingleDocTemplateがどのようにシングルドキュメントを実現しているか調べてみる。

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

まず、ここにブレークポイントを仕込む。
デバッグ実行すると、

ここに来る
ここに来る

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

RUNTIME_CLASS
RUNTIME_CLASS

こうなっていて、

CRuntimeClass
CRuntimeClass

インスタンスにしてCRuntimeClassポインタにしてる(?)みたいだがよくわからない。
詳細はCRuntimeClassあたりでいずれ。

最初に戻って、ステップインでどうなるか。

new
new

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

もう一度
もう一度

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

コンストラクタ
コンストラク

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

m_pOnlyDoc
m_pOnlyDoc

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

NULL
NULL

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

検索
検索

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

検索結果
検索結果

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

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

こんな感じで。

またデバッグ実行
またデバッグ実行

ここに来たら、続行。

コンストラクタ
コンストラク

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

GetFirstDocPosition
GetFirstDocPosition

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

AssertValid
AssertValid

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

またここだ
またここだ

またここだ。

またここだ
またここだ

これも、またここだ。

OpenDocumentFile
OpenDocumentFile

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

NULLなので
NULLなので

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

ここに来る
ここに来る

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

AddDocument
AddDocument

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

pDocをもらう
pDocをもらう

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

CreateNewDocumentの中のAddDocument
CreateNewDocumentの中のAddDocument

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

pDocument
pDocument

pDocumentが返される。

そのまま行くと
そのまま行くと

そのまま行くと、

pFrame
pFrame

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

OnNewDocument
OnNewDocument

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

終わり
終わり

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

OpenDocumentFileの外
OpenDocumentFileの外

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

OnFileNewの外
OnFileNewの外

OnFileNewの外に出る。

エディットビュー
エディットビュー

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

新規作成
新規作成

新規作成を選択。

OpenDocumentFile
OpenDocumentFile

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

SaveModified
SaveModified

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

保存するかどうか
保存するかどうか

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

中を見たらどちらもTRUE
中を見たらどちらもTRUE

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

それでここに来る
それでここに来る

それでここに来ると。

で、このあとにOnNewDocumentがあったと思うが、

OnNewDocument
OnNewDocument

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

そうここ
そうここ

出てくるとこう。

InitialUpdateFrame
InitialUpdateFrame

InitialUpdateFrameで更新。

OnFileNew
OnFileNew

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

新規作成の状態
新規作成の状態

テキストがまっさらになって新規作成の状態。

このようにシングルドキュメントインターフェースは動いてる。
いやー、複雑・・・。

Sample/mfc/CSingleDocTemplate/CSingleDocTemplate/src/CSingleDocTemplate at master · bg1bgst333/Sample · GitHub