#pragma once #include "SigmaDoc.h" #include "DrawOperator/Xy.h" #include /** * 曲线路径点绘制类 */ class CurveNodeDrawer { public: CurveNodeDrawer(CSigmaDoc* pDoc) : m_pDoc(pDoc) { assert(m_pDoc != nullptr); } void Draw(CDC* pDC, CPositionList& positions) const { if (pDC == nullptr) { return; } CSize size = m_pDoc->GetHandleSize(); POSITION pos = positions.GetHeadPosition(); while (pos != nullptr) { POSITION pt = positions.GetNext(pos); COne* pOne = m_pDoc->m_pXy->GetAt(pt); if (pOne == nullptr) { continue; } if (pOne->GetType() != DOUBLEFOX_CURVE) { continue; } CCurveEx* pCurve = pOne->GetValueSafe(); DrawSingleNode(pDC, pCurve, size); } } private: // 仅绘制单个曲线节点(核心绘制逻辑) void DrawSingleNode(CDC* pDC, CCurveEx* pCurve, const CSize& handleSize) const { CSize sz = m_pDoc->GetHandleSize(); int lastDrawIndex = 0; for (int i = 0; i < pCurve->num; i++) { CPoint pt1 = m_pDoc->GetDC().GetScreen(pCurve->x[i], pCurve->y[i]); if (i == 0 || i == pCurve->num - 1) { m_pDoc->DrawHandle(pCurve->x[i], pCurve->y[i], TRACKER_NO_EDIT, pDC); } else { CPoint pt2 = m_pDoc->GetDC().GetScreen(pCurve->x[lastDrawIndex], pCurve->y[lastDrawIndex]); if (abs(pt1.x - pt2.x) > sz.cx || abs(pt1.y - pt2.y) > sz.cy) { m_pDoc->DrawHandle(pCurve->x[i], pCurve->y[i], TRACKER_NO_EDIT, pDC); lastDrawIndex = i; } } } } CSigmaDoc* m_pDoc = nullptr; };