Привет, я, наконец, понял, как это сделать.
OnPaint событие следующим образом:
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
{
dc.MoveTo(m_FirstPoint.x,m_FirstPoint.y);
dc.LineTo(m_SecondPoint.x,m_SecondPoint.y);
dc.LineTo(m_ThirdPoint.x,m_ThirdPoint.y);
dc.LineTo(m_FourthPoint.x,m_FourthPoint.y);
dc.LineTo(m_FirstPoint.x,m_FirstPoint.y);
}
}
LButtonDown выглядит следующим образом:
void CChildView::OnLButtonDown(UINT nFlags,CPoint point)
{
CDC* pDC=GetDC();
if(m_iPointCount==1)
{
m_FirstPoint.x=point.x;
m_FirstPoint.y=point.y;
pDC->TextOut(m_FirstPoint.x,m_FirstPoint.y,"1");
rgn1.CreateEllipticRgn((m_FirstPoint.x-50),(m_FirstPoint.y-50),(m_FirstPoint.x+50),(m_FirstPoint.y+50));
}
if(m_iPointCount==2)
{
m_SecondPoint.x=point.x;
m_SecondPoint.y=point.y;
pDC->TextOut(m_SecondPoint.x,m_SecondPoint.y,"2");
rgn2.CreateEllipticRgn((m_SecondPoint.x-50),(m_SecondPoint.y-50),(m_SecondPoint.x+50),(m_SecondPoint.y+50));
}
if(m_iPointCount==3)
{
m_ThirdPoint.x=point.x;
m_ThirdPoint.y=point.y;
pDC->TextOut(m_ThirdPoint.x,m_ThirdPoint.y,"3");
rgn3.CreateEllipticRgn((m_ThirdPoint.x-50),(m_ThirdPoint.y-50),(m_ThirdPoint.x+50),(m_ThirdPoint.y+50));
}
if(m_iPointCount==4)
{
m_FourthPoint.x=point.x;
m_FourthPoint.y=point.y;
pDC->TextOut(m_FourthPoint.x,m_FourthPoint.y,"4");
rgn4.CreateEllipticRgn((m_FourthPoint.x-50),(m_FourthPoint.y-50),(m_FourthPoint.x+50),(m_FourthPoint.y+50));
InvalidateRect(0);
}
if(m_iPointCount>4)
{
if(PtInRegion(rgn1,point.x,point.y))
{
m_fflag=true;
}
if(PtInRegion(rgn2,point.x,point.y))
{
m_sflag=true;
}
if(PtInRegion(rgn3,point.x,point.y))
{
m_tflag=true;
}
if(PtInRegion(rgn4,point.x,point.y))
{
m_foflag=true;
}
}
m_iPointCount++;
}
В MouseMove следующим образом:
void CChildView::OnMouseMove(UINT nFlags,CPoint point)
{
if(m_iPointCount>4)
if((nFlags & MK_LBUTTON)==MK_LBUTTON)
{
if(m_fflag==true)
{
m_FirstPoint=point;
InvalidateRect(0);
}
if(m_sflag==true)
{
m_SecondPoint=point;
InvalidateRect(0);
}
if(m_tflag==true)
{
m_ThirdPoint=point;
InvalidateRect(0);
}
if(m_foflag==true)
{
m_FourthPoint=point;
InvalidateRect(0);
}
}
}
Событие LButtonUp выглядит следующим образом:
void CChildView::OnLButtonUp(UINT nFlags,CPoint point)
{
CDC* pDC=GetDC();
if(m_fflag==true)
{
m_fflag=false;
rgn1.DeleteObject();
rgn1.CreateEllipticRgn((m_FirstPoint.x-50),(m_FirstPoint.y-50),(m_FirstPoint.x+50),(m_FirstPoint.y+50));
}
if(m_sflag==true)
{
m_sflag=false;
rgn2.DeleteObject();
rgn2.CreateEllipticRgn((m_SecondPoint.x-50),(m_SecondPoint.y-50),(m_SecondPoint.x+50),(m_SecondPoint.y+50));
}
if(m_tflag==true)
{
m_tflag=false;
rgn3.DeleteObject();
rgn3.CreateEllipticRgn((m_ThirdPoint.x-50),(m_ThirdPoint.y-50),(m_ThirdPoint.x+50),(m_ThirdPoint.y+50));
}
if(m_foflag==true)
{
m_foflag=false;
rgn4.DeleteObject();
rgn4.CreateEllipticRgn((m_FourthPoint.x-50),(m_FourthPoint.y-50),(m_FourthPoint.x+50),(m_FourthPoint.y+50));
}
}
Вот как это работает:
1) Целое m_iPointCount инициализируется 1. Это используется для хранения количества очков.
2) Флаги изначально установлены в false m_fflag = false; m_sflag = false; m_tflag = false; m_foflag = false; (Четыре флага соответствуют четырем точкам многоугольника).
3) При щелчке мышью в первые 4 раза 4 точки сохраняются в m_Firstpoint, m_Secondpoint, m_Thirdpoint и m_Fourthpoint. Соответственно создаются четыре области (rgn1, rgn2, rgn3, rgn4 рядом с 4 точками). 4 точки связаны с образованием многоугольника.
4) Когда клик сделан в течение 5-го раза (после того, как мы получим многоугольник), проверка выполняется с использованием условия, чтобы определить, что точка лежит в любом из 4-х регионов. Соответственно флаги установлены на true. (Если точка лежит в rgn1, то m_fflag устанавливается в true и т. д.).
5) Рассмотрите, что 5-й клик сделан в rgn1, и теперь m_fflag истинно, а мышь перемещена. Здесь точки, используемые для рисования многоугольника в сообщении краски, обновляются, и метод paint вызывается с использованием InvalidateRect (0) , Многоугольник перерисовывается. Теперь m_Firstpoint обновляется до новой позиции.
6) Когда кнопка мыши отпущена после перетаскивания, флаг устанавливается в значение «ложь», а старая область удаляется и создается рядом с новой точкой. Так что регион также обновляется.
7) Я объяснил это для первого пункта, это применимо для всех точек.
Спасибо.
Я уже ответил на ваш другой пост, что почти то же самое. http://stackoverflow.com/questions/29939793/dragging-points-to-change-the-shapes?noredirect = 1 # comment48005147_29939793 – Robson
Ya. Но, как я предположил, я попытался сам и вышел с этим. – BeginnerWin32