「MFC ドキュメントとビューの分離」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==MFC ドキュメントとビューの分離== {{category MFC}} {{amazon|4891000503}} MFC ドキュメント ===ドキュメントとビューの相互作用…」) |
|||
(同じ利用者による、間の1版が非表示) | |||
1行目: | 1行目: | ||
− | ==MFC ドキュメントとビューの分離== | + | ==[[MFC ドキュメントとビューの分離]]== |
− | + | [[Category:MFC]] | |
{{amazon|4891000503}} | {{amazon|4891000503}} | ||
− | MFC ドキュメント | + | [[MFC ドキュメント]] |
===ドキュメントとビューの相互作用関数=== | ===ドキュメントとビューの相互作用関数=== | ||
21行目: | 21行目: | ||
*'''派生ドキュメントクラス'''のメンバ関数からUpdateAllViewsを呼び出す場合、最初の引数pSenderをNULLにする | *'''派生ドキュメントクラス'''のメンバ関数からUpdateAllViewsを呼び出す場合、最初の引数pSenderをNULLにする | ||
*'''派生ビュークラス'''のメンバ関数から呼び出す場合は、以下のようにpSenderにthis(現在のビュー)を設定する。 | *'''派生ビュークラス'''のメンバ関数から呼び出す場合は、以下のようにpSenderにthis(現在のビュー)を設定する。 | ||
− | GetDocument()- | + | GetDocument()->UpdateAllViews(this); |
*引数をNULL以外にすることで、現在のビューに対して通知が行われない(現在のビューは自分自身で更新を行っているものとする) | *引数をNULL以外にすることで、現在のビューに対して通知が行われない(現在のビューは自分自身で更新を行っているものとする) | ||
2020年2月16日 (日) 04:29時点における最新版
目次
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関数からの基本クラスの関数呼び出しはそのまま残しておくこと
© 2006 矢木浩人