ビューの描画

アプリケーションでのほぼすべての描画は、ビューの OnDraw メンバー関数で発生し、ビュー クラスでそれらをオーバーライドする必要があります (例外はマウス描画であり、以下で説明します 。ビューを使用したユーザー入力の解釈。)オーバーライド OnDraw :

  1. 指定したドキュメント メンバー関数を呼び出してデータを取得します。

  2. フレームワークが OnDraw に渡すデバイス コンテキスト オブジェクトのメンバー関数を呼び出して、データを表示します。

ドキュメントのデータが何らかの方法で変更された場合、その変更が反映されるように、ビューを再描画する必要があります。 通常、この状況は、ユーザーがドキュメントのビューを通じて変更を行った場合に発生します。 この場合、ビューはドキュメントの UpdateAllViews メンバー関数を呼び出して、同じドキュメントのすべてのビューに自身を更新するように通知を行います。 UpdateAllViews では、各ビューの OnUpdate メンバー関数を呼び出します。 OnUpdate の既定の実装では、ビューのクライアント領域全体が無効になります。 それをオーバーライドして、ドキュメントの変更された部分にマップされるクライアント領域の領域のみを無効にできます。

クラス CDocumentUpdateAllViews メンバー関数と CView クラスの OnUpdate メンバー 関数を使用して、ドキュメントの変更された部分を説明する情報を渡すことができます。 この "hint" メカニズムを使用して、ビューを再描画する必要のある領域を制限できます。 OnUpdate は、2 つの "hint" 引数を受け取ります。 LPARAM 型の最初の lHint を使用すると、任意のデータを渡すことができます。一方、CObject* 型の 2 番目の pHint を使用すると、CObject から派生させたオブジェクトにポインターを渡すことができます。

ビューが無効になると、Windows によって WM_PAINT メッセージが送信されます。 ビューの OnPaint ハンドラー関数は、CPaintDC クラスのデバイス コンテキスト オブジェクトを作成してメッセージに応答し、ビューの OnDraw メンバー関数を呼び出します。 通常、オーバーライドする OnPaint ハンドラー関数を記述する必要はありません。

デバイス コンテキストは、ディスプレイやプリンターといったデバイスの描画属性に関する情報を保持する Windows のデータ構造体です。 すべての描画呼び出しは、デバイス コンテキスト オブジェクトを使用して行われます。 画面上で描画する場合は、CPaintDC オブジェクトに OnDraw が渡されます。 プリンターで描画する場合は、現在のプリンター用に設定された 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 呼び出しが画面描画に対して行われる場合、pDC で渡される CDC オブジェクトは、コンストラクターによって BeginPaint が既に呼び出されている CPaintDC です。 描画関数の呼び出しは、デバイス コンテキスト ポインターを介して行われます。 デバイス コンテキストと描画呼び出しの詳細については、「MFC リファレンス」および「ウィンドウ オブジェクトの操作」の「CDC」クラスを参照してください。

OnDraw の記述方法のその他の例については、「MFC サンプル」を参照してください。

関連項目

ビューの使い方