#pragma once #include "itemcurve.h" #include ".\ActionItem.h" #include "CurveEditorBase.h" #include /* * 注意:此文件已进行模式分离重构 * * 原 CItemCurveEdit 类混合了4种编辑模式的代码,现已分离为: * - CItemCurveEditBase : 抽象基类 * - CItemCurveEditDefault : 默认模式(直接移动节点) * - CItemCurveEditLinear : 线性模式(线性影响周围节点) * - CItemCurveEditCosine : 余弦模式(余弦平滑影响) * - CItemCurveEditSpline : 样条模式(三次样条插值) * * 当前 CItemCurveEdit 作为适配器/代理类: * - 保持原有接口不变,确保向后兼容 * - 内部持有 m_currentEditor(ItemCurveEditBase*) * - 所有调用转发到当前编辑器 * - 支持运行时动态切换编辑模式 */ class HandleDrawer; namespace NItem { #define DRAG_NODE_DEFAULT 0 //直接移动当前节点 #define DRAG_NODE_LINE 1 //线性移动节点 #define DRAG_NODE_COS 2 //余弦移动节点 #define DRAG_NODE_SPLINE 3 //三次样条移动节点 #define DRAG_LINE_COLOR RGB(0,153,255) // CItemCurveEdit: 适配器/代理类,转发到具体的编辑器实现 class CItemCurveEdit : public CItemCurve { public: CItemCurveEdit(CSigmaDoc* ppDoc); virtual ~CItemCurveEdit(void); // 实现接口,转发到 m_currentEditor void OnDraw(CXyDC* pDC) override; void OnLButtonDblClk(UINT nFlags, CPoint point) override; void OnLButtonDown(CDC* pDC, UINT nFlags, CPoint point, int vk) override; int OnMouseMove(CDC* pDC, UINT nFlags, CPoint point) override; void OnLButtonUp(CDC* pDC, UINT nFlags, CPoint point, int vk) override; BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) override; BOOL OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) override; BOOL OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) override; int GetSubMenu() override; void SetPos(POSITION pos) override; void Clear(void); void Draw(CDC* pDC); void DrawAssistant(CDC* pDC, int mouseX, int mouseY) override; int GetNumberOfNode(); void EreaseHandles(CDC* pDC); // 编辑器切换 void SetCurveState(int state, CDC* pDC) override; void SwitchEditMode(int mode); // 显式切换编辑模式 // 兼容性接口(转发) void EndEdit(void); void CancelAll(void); BOOL IsCanCancelAll(void); int HitTestHandle(CPoint point); void DeleteHandle(int nIndex); int AddHandle(CPoint point); CCurveEx* GetCurCurve(void); virtual void AttachProcess(CPointList& oldPoints, CPointList& newPoints); virtual void DrawMoveLine(void); virtual void GetMarkCurve(void); virtual BOOL IsCanAddHandle(CPoint point, double* pl0 = nullptr); virtual void GetXY(CCurveEx* pValue, int nIndex, dfPoint& point); CPoint2D GetCDown() const; CPoint2D GetCLast() const; private: // 核心:持有当前编辑器的智能指针 std::shared_ptr m_currentEditor; CSigmaDoc* m_pDoc; // 保存文档指针,用于创建编辑器 int GetCurrentEditMode() const; // 辅助方法:创建编辑器 std::shared_ptr CreateEditor(int mode); }; };