|
|
#pragma once
|
|
|
#include "itemcurve.h"
|
|
|
#include ".\ActionItem.h"
|
|
|
#include "CurveEditorBase.h"
|
|
|
#include <memory>
|
|
|
|
|
|
/*
|
|
|
* 注意:此文件已进行模式分离重构
|
|
|
*
|
|
|
* 原 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<CurveEditorBase> m_currentEditor;
|
|
|
CSigmaDoc* m_pDoc; // 保存文档指针,用于创建编辑器
|
|
|
|
|
|
int GetCurrentEditMode() const;
|
|
|
|
|
|
// 辅助方法:创建编辑器
|
|
|
std::shared_ptr<CurveEditorBase> CreateEditor(int mode);
|
|
|
};
|
|
|
|
|
|
}; |