次の方法で共有


ビューの描画

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

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

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

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

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

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

デバイス コンテキストは、ディスプレイやプリンターなどのデバイスの描画属性に関する情報を含む Windows データ構造です。 すべての描画呼び出しは、デバイス コンテキスト オブジェクトを介して行われます。 画面上で描画する場合、 OnDrawCPaintDC オブジェクトを渡します。 プリンターで描画する場合は、現在のプリンター用に設定された 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 サンプルを参照してください。

こちらも参照ください

ビューを使用する