Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mfc 拖动点以更改形状_Mfc_Gdi - Fatal编程技术网

Mfc 拖动点以更改形状

Mfc 拖动点以更改形状,mfc,gdi,Mfc,Gdi,我已经用下面的代码连接了4个鼠标点击的点(我使用的是MFC) 我现在想做以下事情 1.每当鼠标单击其中一个点并拖动时,该点应重新定位到新位置。(因此形状会发生更改) 2.这应适用于所有四点 请指导我如何做到这一点。这是如何做到的 开始单击窗口,直到达到以m_iPolygonMaximumSides为单位指定的金额。 当达到指定的点数量时,多边形将闭合,因此现在可以选择点。 在点附近单击以选择该点,拖动将一直进行,直到再次单击为止。 要重置多边形,必须关闭窗口 代码 在CChildView类的cp

我已经用下面的代码连接了4个鼠标点击的点(我使用的是MFC)

我现在想做以下事情

1.每当鼠标单击其中一个点并拖动时,该点应重新定位到新位置。(因此形状会发生更改)

2.这应适用于所有四点

请指导我如何做到这一点。

这是如何做到的 开始单击窗口,直到达到以m_iPolygonMaximumSides为单位指定的金额。 当达到指定的点数量时,多边形将闭合,因此现在可以选择点。 在点附近单击以选择该点,拖动将一直进行,直到再次单击为止。 要重置多边形,必须关闭窗口

代码 在CChildView类的cpp文件中添加以下include,因为它用于计算平方根

#include <math.h>
在CChildView构造函数中,使用所需的数量(4)初始化m_iPolygonMaximumSides,并使用(-1,-1)初始化m_selectedPoint,如

然后将其添加到您的CChildView cpp文件中,这些都是使用的方法

void CChildView::OnLButtonDown(UINT nFlags,CPoint point)
{
//检查我们是否已经达到最大点数
if(m_PointList.GetSize()==m_iPolygonMaximumSides)
{
//检查是否已选择一个点,因此我们处于拖动模式
如果(m_selectedPoint.x!=-1)
{
//如果已选择该点,则表示我们要停止拖动,
//所以我们把x设为-1
m_selectedPoint.x=-1;
}
其他的
{
//如果我们没有选择点,我们必须检查单击的点是否是我们的点之一
//所以我们将使用它来搜索out点
对于(POSITION pos=m_PointList.GetHeadPosition();pos!=NULL;m_PointList.GetNext(pos))
{
CPoint currentPoint=m_PointList.GetAt(位置);
//这是毕达哥拉斯定理,用来求两点a和B之间的距离
//距离=平方根((A.x-B.x)^2+(A.y-B.y)^2)
int点之间的距离=地板(sqrt(功率(双(当前点x-point.x),2)+功率(双(当前点y-point.y),2));
//如果这个距离小于10像素,那么我们接受它作为点击我们的点
//这只是一个耐受性,所以我们可以随意减少或增加它
//公差越小,您必须单击才能选择该点
if(点之间的距离0)
{
CDC*pDC=GetDC();
CPoint lastPoint=m_PointList.GetTail();
//从上一个(最后一个)点到新点绘制一条线
pDC->移动到(lastPoint.x,lastPoint.y);
pDC->LineTo(点x、点y);
//如果我们要达到最大数量的点,那么我们必须关闭多边形
if(m_PointList.GetSize()==m_iPolygonMaximumSides-1)
{
CPoint firstPoint=m_PointList.GetHead();
//从当前点到第一点绘制一条线
pDC->移动到(点x、点y);
pDC->LineTo(firstPoint.x,firstPoint.y);
}
}
//只有在您完成所有工作后,才可以将该点添加到列表中,前提是我们没有达到最大金额
if(m_PointList.GetSize()MoveTo(pointBefore.x,pointBefore.y);
pDC->LineTo(currentPoint.x,currentPoint.y);
//画中间点
while(pos!=NULL)
{
pointBefore=当前点;
currentPoint=m_PointList.GetNext(位置);
pDC->MoveTo(pointBefore.x,pointBefore.y);
pDC->LineTo(currentPoint.x,currentPoint.y);
} 
//现在关闭警察局
pointBefore=当前点;
currentPoint=m_PointList.GetHead();
pDC->MoveTo(pointBefore.x,pointBefore.y);
pDC->LineTo(currentPoint.x,currentPoint.y);
}
}

=)我又来了。在MouseMove上使用“m_iPointamount”可以做其他你需要做的事情,在这里面你必须检查鼠标是否按下,然后做你需要做的事情。但很明显,在这里你也希望能够“选择”这一点。正如你的用户名所说,你是“初学者”“所以我认为首先你应该多学一些关于MFC C++如何工作、GDI是如何工作、检查可用的功能和特性的基本知识,然后尝试实现一些东西,像这样进入黑暗是很难的。如何保存第一点?”
 m_LastPoint.x=-1;
 m_LastPoint.y=-1;
 m_iPointAmount=1;
#include <math.h>
CList<CPoint> m_PointList;
CPoint m_selectedPoint;
int m_iPolygonMaximumSides;
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
void DrawPolygonFromList();
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
m_iPolygonMaximumSides = 4;
m_selectedPoint = CPoint(-1,-1);