デバイスコンテキスト

メモ:  Category:sdk_mfc

Windowに描画するには、デバイスコンテキストを使用します。

デバイスコンテキストとは、画用紙と画材をひとまとまりにしたようなものです。Windowに描画するとは、この画用紙に絵を描くようにデバイスコンテキストに描いていくということになります。画用紙に絵を描くには、ペンやブラシが必要ですがデバイスコンテキストには、その絵を描く画材があらかじめ一種類ずつ用意されています。この画材は、ペン、ブラシ、フォント、ビットマップ、パレットリージョンといったもので、GDIオブジェクトと呼ばれます。

描画するには?

線と円を描いてみます。

void CDCViewView::OnPaint()
{
    CPaintDC dc(this);

    CRect rect(dc.m_ps.rcPaint);
    dc.LineTo(rect.right,rect.bottom);
    dc.Ellipse(0,0,50, 50);
}

CPaintDCクラスは、CDCクラスからの派生です。構築時にBeginPaint関数を実行します。

CPaintDCは、WM_PAINTメッセージに応答するときのみ使用できるので、通常はメンバー関数OnPaintで使います。OnPaint以外でデバイスコンテキストを取得するには、APIでの::GetDC()を使用するかCWndから派生されたオブジェクトのときはCWnd.GetDC()を使用します。

上記例は、線を左上から右下に引くのと左隅に円を描画します。

画材を変更する

デバイスコンテキストでは、画材の種類ごとにひとつずつ道具を持っています。

ペンの色や種類を変えるには持ち替えるという作業を行います。

void CDCViewView::OnPaint()
{
    CPaintDC dc(this);
    CPen pen;
    CPen *pOldPen;

    pen.CreatePen(PS_DOT,1,RGB( 255, 0, 0 ));
    pOldPen = dc.SelectObject(&pen); 

    CRect rect(dc.m_ps.rcPaint);
    dc.LineTo(rect.right,rect.bottom);
    dc.Ellipse(0,0,50,50);
    dc.SelectObject(pOldPen); 
}

新しく赤色の点線が引けるペンを作成します。

あらかじめデバイスコンテキストにセットされているペンを新しく作成したペンへ持ち替えます。もともと持っていたペンは、後で戻さないといけないのでとっておきます。 線を引く部分は、以前のサンプルと同じです。線を引き終えたら元のペンへ戻してあげます。

CPenは、スコープから外れると自動的に削除されます。(又は、DeleteObject())

bluenote by BBB