アプリケーションのほぼすべての描画がビューの OnDraw
メンバー関数で発生します。この関数は、ビュー クラスでオーバーライドする必要があります。 (例外は、「ビューを使用したユーザーによる入力の解釈」で説明されているマウス描画です)。OnDraw
オーバーライド:
指定したドキュメント メンバー関数を呼び出してデータを取得します。
フレームワークが
OnDraw
に渡すデバイス コンテキスト オブジェクトのメンバー関数を呼び出して、データを表示します。
ドキュメントのデータが何らかの方法で変更された場合は、変更を反映するためにビューを再描画する必要があります。 通常、これは、ユーザーがドキュメントのビューを通じて変更を行ったときに発生します。 この場合、ビューはドキュメントの UpdateAllViews メンバー関数を呼び出して、同じドキュメントのすべてのビューに自身を更新するよう通知します。 UpdateAllViews
は、各ビューの OnUpdate メンバー関数を呼び出します。 OnUpdate
の既定の実装では、ビューのクライアント領域全体が無効になります。 これをオーバーライドして、ドキュメントの変更された部分にマップされているクライアント領域の領域のみを無効にすることができます。
クラス UpdateAllViews
の CDocument
メンバー関数とクラスのOnUpdate
メンバー関数CView
、ドキュメントの変更された部分を説明する情報を渡すことができます。 この "ヒント" メカニズムを使用すると、ビューを再描画する必要がある領域を制限できます。 OnUpdate
は 2 つの "hint" 引数を受け取ります。 LPARAM 型の最初の lHint では任意のデータを渡すことができますが、2 番目の pHint 型は CObject
* 型で、CObject
から派生した任意のオブジェクトへのポインターを渡すことができます。
ビューが無効になると、Windows によって WM_PAINT メッセージが送信されます。 ビューの OnPaint ハンドラー関数は、 CPaintDC クラスのデバイス コンテキスト オブジェクトを作成してメッセージに応答し、ビューの OnDraw
メンバー関数を呼び出します。 通常、オーバーライドする OnPaint
ハンドラー関数を記述する必要はありません。
デバイス コンテキストは、ディスプレイやプリンターなどのデバイスの描画属性に関する情報を含む Windows データ構造です。 すべての描画呼び出しは、デバイス コンテキスト オブジェクトを介して行われます。 画面上で描画する場合、 OnDraw
は CPaintDC
オブジェクトを渡します。 プリンターで描画する場合は、現在のプリンター用に設定された CDC オブジェクトが渡されます。
ビューで描画するためのコードは、最初にドキュメントへのポインターを取得してから、デバイス コンテキストを介して描画呼び出しを行います。 次の簡単な OnDraw
例は、プロセスを示しています。
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString s = pDoc->GetData(); // Returns a CString
CRect rect;
GetClientRect(&rect);
pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
}
この例では、 GetData
関数を派生ドキュメント クラスのメンバーとして定義します。
この例では、ドキュメントから取得した文字列をビューの中央に印刷します。 OnDraw
呼び出しが画面描画用の場合、CDC
で渡される オブジェクトは、コンストラクターが既に CPaintDC
を呼び出したBeginPaint
です。 描画関数の呼び出しは、デバイス コンテキスト ポインターを介して行われます。 デバイス コンテキストと描画呼び出しの詳細については、「MFC リファレンス」および「ウィンドウ オブジェクトの操作」の「CDC クラス」を参照してください。
OnDraw
を記述する方法の他の例については、MFC サンプルを参照してください。