2015-05-04 3 views
0

Я хочу сделать 4 щелчка мышью в клиентской области. Как только 4-й щелчок будет сделан, 4 точки должны быть соединены, чтобы сформировать форму. Я сделал это, используя следующий код. (Я использую MFC).Настройка фигур с помощью движущихся точек мышью

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)); 
    pDC->MoveTo(m_FirstPoint.x,m_FirstPoint.y); 
    pDC->LineTo(m_SecondPoint.x,m_SecondPoint.y); 
    pDC->LineTo(m_ThirdPoint.x,m_ThirdPoint.y); 
    pDC->LineTo(m_FourthPoint.x,m_FourthPoint.y); 
    pDC->LineTo(m_FirstPoint.x,m_FirstPoint.y); 
} 
m_iPointCount++; 
} 

Каждый раз, когда счетчик точка incremented.I также создали 4 региона около 4 points.What я хочу сделать сейчас, когда я нажимаю в любой из областей, которые я создал и перетащить его на новое место точка должна перейти в новое место, где кнопка мыши будет отпущена после перетаскивания. Чтобы форма изменилась. Это должно быть применимо ко всем 4 регионам.

Я знаю, что мне нужно использовать функции Mousemove и LButtonUp, но я понятия не имею, как это сделать. Помощь Pls.

+1

Я уже ответил на ваш другой пост, что почти то же самое. http://stackoverflow.com/questions/29939793/dragging-points-to-change-the-shapes?noredirect = 1 # comment48005147_29939793 – Robson

+0

Ya. Но, как я предположил, я попытался сам и вышел с этим. – BeginnerWin32

ответ

0

Привет, я, наконец, понял, как это сделать.

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) Я объяснил это для первого пункта, это применимо для всех точек.

Спасибо.

Смежные вопросы