| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「MFC ドキュメントとビューの分離」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
1行目: 1行目:
==MFC ドキュメントとビューの分離==
+
==[[MFC ドキュメントとビューの分離]]==
{{category MFC}}
+
[[Category:MFC]]
  
 
{{amazon|4891000503}}
 
{{amazon|4891000503}}
  
MFC ドキュメント
+
[[MFC ドキュメント]]
  
 
===ドキュメントとビューの相互作用関数===
 
===ドキュメントとビューの相互作用関数===

2020年2月16日 (日) 04:29時点における最新版

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

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関数からの基本クラスの関数呼び出しはそのまま残しておくこと