!!!MFC ドキュメントとビューの分離 {{category MFC}} {{amazon 4891000503}} MFC ドキュメント !!ドキュメントとビューの相互作用関数 *ドキュメントオブジェクトがデータを保持し、ビューオブジェクトによって表示と編集を行う。 *SDIアプリケーションでは、CDocumentから派生されたドキュメントクラスとCViewから派生されたビュークラスを持つ *ドキュメント、ビュー、それ以外のアプリケーションフレームワークとの間には複雑ハンドシェイク手続きが介在する。 *この手続きを理解するためには、ドキュメントとビュークラスに含まれる、5つの重要なメンバ関数を知る必要がある。 !CView::GetDocument関数 *ビューオブジェクトは、ただ1つのドキュメントオブジェクトにだけ関連付けられる。 *ビューがユーザからの入力を受け取った場合、ビューはドキュメントに対して、内部データを適切に更新するように支持しなければならない。 *GetDocument関数はドキュメントポインタを返す !CDocument::UpdateAllViews関数 *ドキュメントのデータが変更されると、すべてのビューは表現を更新できるように通知を受ける必要がある *'''派生ドキュメントクラス'''のメンバ関数からUpdateAllViewsを呼び出す場合、最初の引数pSenderをNULLにする *'''派生ビュークラス'''のメンバ関数から呼び出す場合は、以下のようにpSenderにthis(現在のビュー)を設定する。 GetDocument()->UpdateAllViews(this); *引数をNULL以外にすることで、現在のビューに対して通知が行われない(現在のビューは自分自身で更新を行っているものとする) !CView::OnUpdate関数 *アプリケーションがCDocument::UpdateAllViews関数を呼び出すと、この仮想関数が呼び出される *一般的には、派生ビュークラスのOnUpdate関数中でドキュメントにアクセスし、ドキュメントのデータを取得し、ビューのデータやメンバを更新し、変更を反映する *別の方法として、OnUpdateでビューの一部を無効化し、その後ビューのOnDraw関数がドキュメントデータを使ってウィンドウ内の描画を行うようにさせることもできる。 *ヒント情報は、UpdateAllViewsの呼び出し時のものがそのまま渡される !CView::OnInitialUpdate関数 *アプリケーションを起動したとき、ファイル−新規作成、ファイル−開くを選択したときに呼び出される *CView基本クラスのOnInitialUpdate関数は、OnUpdateの呼び出しのみを行う *派生クラス内でOnInitialUpdateをオーバーライドする際、その派生ビュークラスから基本クラスのOnInitialUpdate関数か、派生クラスのOnUpdateのどちらかを呼び出すよう注意する。 *派生クラスのOnInitialUpdate関数を使って、ビューオブジェクトの初期化を行うことができる *アプリケーションが開始するとき、OnCreateの直後にOnInitialUpdateが呼び出される。 *OnCreateは一度だけ呼ばれるが、OnInitialUpdateは何度も呼び出される。 !CDocument::OnNewDocumentFunction関数 *ドキュメントオブジェクトが最初に生成された時点、あるいはSDIアプリケーションで、ファイル−新規を選択したときに呼び出される *ここでドキュメントメンバーの初期値を設定するのが良い *AppWizardによってオーバーライドされるOnNewDocument関数からの基本クラスの関数呼び出しはそのまま残しておくこと