[MFC] 多角形の描画と当たり判定
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"クリックされたよ!");
    }
}
多角形をクリックすると、こんな感じに動作します。

おしまい。


ディスカッション
コメント一覧
まだ、コメントがありません