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

おしまい。



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