使用MFC鼠标画曲线,以下程序运行之后:
```c++
void CMyPolygonView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_pt.m_x = point.x;
m_pt.m_y = point.y;
m_bLButtonDown = true;
MyPoint pt;
pt.m_x = point.x;
pt.m_y = point.y;
m_poly.m_vecPt.push_back(pt);
Invalidate();
CView::OnLButtonDown(nFlags, point);
}
void CMyPolygonView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bLButtonDown==true)
{
MyPoint pt;
pt.m_x = point.x;
pt.m_y = point.y;
m_poly.m_vecPt.push_back(pt);
Invalidate();
}
CView::OnMouseMove(nFlags, point);
}
void CMyPolygonView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bLButtonDown==true)
{
MyPoint pt;
pt.m_x = point.x;
pt.m_y = point.y;
m_poly.m_vecPt.push_back(pt);
m_bLButtonDown = false;
}
Invalidate();
CView::OnLButtonUp(nFlags, point);
}
出现了以下问题:


即前一条曲线的终点和后一条曲线的起点自动连接为一条直线,请问这种情况该如何避免,使得两条曲线独立开来?
参考GPT和自己的思路:您可以在绘制曲线时,判断绘制的点是否与上一个点重合。如果重合,则不将该点加入曲线的点集中。这样可以避免相邻两条曲线相连的情况。代码示例如下:
void CMyPolygonView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bLButtonDown == true)
{
MyPoint pt;
pt.m_x = point.x;
pt.m_y = point.y;
// 判断与上一个点是否重合
if (m_poly.m_vecPt.size() < 1)
{
m_poly.m_vecPt.push_back(pt);
}
else
{
MyPoint lastPt = m_poly.m_vecPt.back();
if (pt.m_x != lastPt.m_x || pt.m_y != lastPt.m_y)
{
m_poly.m_vecPt.push_back(pt);
}
}
Invalidate();
}
CView::OnMouseMove(nFlags, point);
}
需要注意的是,在结束绘制后,需要清空点集以便下一次绘制。可以在 OnLButtonUp 函数中添加以下代码:
m_poly.m_vecPt.clear();