MFCでの多角形の描画と当たり判定

2016年1月28日

MFCで多角形を扱う場合には、CRgn クラスを使用します。
それぞれ、以下の API を使用します。
・描画 : CDC::FillRgn()
・当たり判定 : CRgn::PtInRegion()

使い方のサンプルとして、多角形の内側でマウスダウンするとメッセージボックスを表示するプログラムを作ってみます。

CWnd を継承した CChildView に実装していきます。

まず、CChildView クラスにメンバ変数を追加します。
・POINT m_points[11];

CChildView で OnCreate() をオーバーライドして、この中で配列を初期化します。

int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
    {
        return -1;
    }

    // 星型っぽく設定する.
    m_points[0].x = 30;
    m_points[0].y = 30;
    m_points[1].x = 50;
    m_points[1].y = 30;
    m_points[2].x = 60;
    m_points[2].y = 10;
    m_points[3].x = 70;
    m_points[3].y = 30;
    m_points[4].x = 90;
    m_points[4].y = 30;
    m_points[5].x = 75;
    m_points[5].y = 45;
    m_points[6].x = 80;
    m_points[6].y = 65;
    m_points[7].x = 60;
    m_points[7].y = 55;
    m_points[8].x = 40;
    m_points[8].y = 65;
    m_points[9].x = 45;
    m_points[9].y = 45;
    m_points[10] = m_points[0];

    return 0;
}

CChildView で OnPaint() をオーバーライドして、この中で多角形の描画を行います。

void CChildView::OnPaint()
{
    CPaintDC dc(this);
    
    RECT rect;
    GetClientRect(&rect);

    CDC* pDC = &dc;
    pDC->FillSolidRect(&rect, RGB(210,210,210));

    // 塗り潰しに使用するブラシを生成する.
    CBrush brush(RGB(100,200,100));

    // 多角形の塗り潰し.
    CRgn rgn;
    rgn.CreatePolygonRgn(m_points, 11, ALTERNATE);
    pDC->FillRgn(&rgn, &brush);
}

CChildView で OnLButtonDown() をオーバーライドして,この中で当たり判定とメッセージボックスの表示を行います

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
    CRgn rgn;
    rgn.CreatePolygonRgn(m_points, 11, ALTERNATE);

    // 多角形の当たり判定を行う.
    // 多角形の内側に point がある場合には, TRUE が返される.
    if (rgn.PtInRegion(point))
    {
        // メッセージボックスの表示.
        AfxMessageBox(L"クリックされたよ!");
    }
}

多角形をクリックすると、こんな感じに動作します。

2014_10_16_PtInRegion

おしまい。

スポンサーリンク

MFCMFC

Posted by peliphilo