【MFC】色々な図形の描画方法

MFCで描画処理を行う場合、デバイスコンテキストに対してアレコレします。

基本的には以下の記事で紹介したダブルバッファリングと組み合わせて使用します。

【MFC】描画処理でダブルバッファリングを行う方法

スポンサーリンク

線分の描画

線分を描画する場合はMoveTo関数とLineTo関数を使います。

// 線分の描画
void DrawLine(CDC* pDC, CPoint pt1, CPoint pt2, int width, COLORREF color)
{
    CPen pen(PS_SOLID, width, color);
    CPen* pOldPen = pDC->SelectObject(&pen);
    pDC->MoveTo(pt1);
    pDC->LineTo(pt2);
    pDC->SelectObject(pOldPen);
    pen.DeleteObject();
}

矩形の描画

矩形を描画する場合は、3パターンに分けて処理を行います。

// 矩形描画(枠線のみ)
void DrawRect(CDC* pDC, CRect rc, int width, COLORREF borderColor)
{
    CPen pen(PS_SOLID, width, borderColor);
    HGDIOBJ hBrs = ::GetStockObject(NULL_BRUSH);
    CPen* pOldPen = pDC->SelectObject(&pen);
    HGDIOBJ hOldBrs = pDC->SelectObject(&hBrs);
    pDC->Rectangle(rc);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(hOldBrs);
    pen.DeleteObject();
}
// 矩形描画(塗り潰しのみ)
void DrawRect(CDC* pDC, CRect rc, COLORREF fillColor)
{
    pDC->FillSolidRect(rc, fillColor);
}
// 矩形描画
void DrawRect(CDC* pDC, CRect rc, int width, COLORREF borderColor, COLORREF fillColor)
{
    CPen pen(PS_SOLID, width, borderColor);
    CBrush brs(fillColor);
    CPen* pOldPen = pDC->SelectObject(&pen);
    CBrush* pOldBrs = pDC->SelectObject(&brs);
    pDC->Rectangle(rc);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldBrs);
    pen.DeleteObject();
    brs.DeleteObject();
}

角丸矩形の描画

角丸矩形を描画する場合は、矩形の描画と同様に3パターンに分けて処理を行います。

// 角丸矩形描画(枠線のみ)
void DrawRoundRect(CDC* pDC, CRect rc, CPoint round, int width, COLORREF borderColor)
{
    CPen pen(PS_SOLID, width, borderColor);
    HGDIOBJ hBrs = ::GetStockObject(NULL_BRUSH);
    CPen* pOldPen = pDC->SelectObject(&pen);
    HGDIOBJ hOldBrs = pDC->SelectObject(&hBrs);
    pDC->RoundRect(rc, round);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(hOldBrs);
    pen.DeleteObject();
}
// 角丸矩形描画(塗り潰しのみ)
void DrawRoundRect(CDC* pDC, CRect rc, CPoint round, COLORREF fillColor)
{
    // 以下の関数を流用
    DrawRoundRect(pDC, rc, round, 0, fillColor, fillColor);
}
// 角丸矩形描画
void DrawRoundRect(CDC* pDC, CRect rc, CPoint round, int width, COLORREF borderColor, COLORREF fillColor)
{
    CPen pen(PS_SOLID, width, borderColor);
    CBrush brs(fillColor);
    CPen* pOldPen = pDC->SelectObject(&pen);
    CBrush* pOldBrs = pDC->SelectObject(&brs);
    pDC->RoundRect(rc, ruond);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldBrs);
    pen.DeleteObject();
    brs.DeleteObject();
}

円の描画

円を描画する場合は、矩形の描画と同様に3パターンに分けて処理を行います。

// 円描画(枠線のみ)
void DrawEllipse(CDC* pDC, CRect rc, int width, COLORREF borderColor)
{
    CPen pen(PS_SOLID, width, borderColor);
    HGDIOBJ hBrs = ::GetStockObject(NULL_BRUSH);
    CPen* pOldPen = pDC->SelectObject(&pen);
    HGDIOBJ hOldBrs = pDC->SelectObject(&hBrs);
    pDC->Ellipse(rc);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(hOldBrs);
    pen.DeleteObject();
}
// 円描画(塗り潰しのみ)
void DrawEllipse(CDC* pDC, CRect rc, COLORREF fillColor)
{
    // 以下の関数を流用
    DrawEllipse(pDC, rc, 0, fillColor, fillColor);
}
// 円描画
void DrawEllipse(CDC* pDC, CRect rc, int width, COLORREF borderColor, COLORREF fillColor)
{
    CPen pen(PS_SOLID, width, borderColor);
    CBrush brs(fillColor);
    CPen* pOldPen = pDC->SelectObject(&pen);
    CBrush* pOldBrs = pDC->SelectObject(&brs);
    pDC->Ellipse(rc);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldBrs);
    pen.DeleteObject();
    brs.DeleteObject();
}

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です