[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"クリックされたよ!"); } }
多角形をクリックすると、こんな感じに動作します。
おしまい。
ディスカッション
コメント一覧
まだ、コメントがありません