You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.8 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include "itemcurve.h"
#include ".\ActionItem.h"
#include "CurveEditorBase.h"
#include <memory>
/*
* 注意:此文件已进行模式分离重构
*
* 原 CItemCurveEdit 类混合了4种编辑模式的代码现已分离为
* - CItemCurveEditBase : 抽象基类
* - CItemCurveEditDefault : 默认模式(直接移动节点)
* - CItemCurveEditLinear : 线性模式(线性影响周围节点)
* - CItemCurveEditCosine : 余弦模式(余弦平滑影响)
* - CItemCurveEditSpline : 样条模式(三次样条插值)
*
* 当前 CItemCurveEdit 作为适配器/代理类:
* - 保持原有接口不变,确保向后兼容
* - 内部持有 m_currentEditorItemCurveEditBase*
* - 所有调用转发到当前编辑器
* - 支持运行时动态切换编辑模式
*/
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);
};
};