トップ 一覧 ping 検索 ヘルプ RSS ログイン

MFC ドキュメントとビューの分離の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!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関数からの基本クラスの関数呼び出しはそのまま残しておくこと