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.

127 lines
3.5 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 <memory>
#include "HandleDrawer.h"
#include "itemcurve.h"
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)
// #define TRACKER_SOLID 1
// #define TRACKER_RECT 2
// #define TRACKER_CIRCLE 4
// #define TRACKER_NO_EDIT TRACKER_SOLID | TRACKER_CIRCLE
class CurveEditorBase : public CItemCurve {
public:
CurveEditorBase(CSigmaDoc *pDoc);
virtual ~CurveEditorBase(void);
void OnDraw(CXyDC *pDC) override final;
void OnLButtonDblClk(UINT nFlags, CPoint point) override final;
void OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point,
int vk) override final;
int OnMouseMove(CDC *pDC, UINT nFlags, CPoint point) override final;
void OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk) override final;
BOOL OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message) override final;
BOOL OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) override final;
BOOL OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) override final;
int GetSubMenu() override final;
void SetPos(POSITION pos) override final;
void Clear(void);
void Draw(CDC *pDC);
void DrawAssistant(CDC *pDC, int mouseX, int mouseY) override;
int GetNumberOfNode();
void EreaseHandles(CDC *pDC);
void EndEdit(void);
void CancelAll(void);
BOOL IsCanCancelAll(void);
// 控制点操作
int HitTestHandle(CPoint point);
void DeleteHandle(int nIndex);
int AddHandle(CPoint point);
BOOL IsCanAddHandle(CPoint point, double *pl0 = nullptr);
// 虚函数:样条模式需重写为返回冗余曲线
virtual CCurveEx *GetControlCurve(void);
void GetXY(CCurveEx *pValue, int nIndex, dfPoint &point);
void AttachProcess(CPointList &oldPoints, CPointList &newPoints);
void DrawMoveLine(void);
void GetMarkCurve(void);
CPoint2D GetCDown() const;
CPoint2D GetCLast() const;
protected:
// 默认:绘制两条线段
// 线性/余弦/样条:绘制整条受影响的曲线
virtual void OnDrawDragPreview() = 0;
virtual void OnCalculateDragEffect(CPointList *pList) = 0;
// 在SetPos后调用样条模式用于计算m_pMarkCurve
virtual void OnModeInitialize() {}
// 在OnMouseMove中调用
virtual void OnDragMove(int nIndex, CPoint2D pt) {}
// 获取当前偏移模式Linear/Cosine模式使用
int GetOffsetMode(void);
// 虚函数:样条模式需重写
virtual int AddHandle(double l0);
// 辅助方法:向指定曲线添加点
int AddHandle(CCurveEx *pValue, dfPoint add);
// 鼠标位置(世界坐标)
CPoint2D c_down, c_last;
// 拖动标志
bool m_bLButtonDownWhenMouseMove;
// 备份原始曲线(用于撤销)
std::unique_ptr<COne> m_pBakOne;
// 控制点绘制器
std::unique_ptr<HandleDrawer> m_handleDrawer;
// 鼠标按下点(屏幕坐标)
CPoint m_nLButtonDownPoint;
// 新点列表(用于预览)
CPointList NewPointList;
// 临时点列表
CPointList PointList;
// 控制点绘制模式
DWORD m_nHandleDrawMode;
int m_nModeX;
int m_nModeY; // 绘制模式
private:
void DrawHandle(CXyDC *pDC, CCurveEx *pCurve);
void DrawHandlesByCDC(CDC *pDC, CCurveEx *pCurve);
void DrawSelectHandle(int nHandle);
CRect GetRangeWidthIndex(int nIndex);
CRect GetFirstNodeHandleRectFocus(CPoint point);
void SetDrawMode(int nModeX, int nModeY);
int HitTestHandle(CCurveEx *pValue, CPoint point);
bool IsDragging(int nFlags) const;
int HandleMouseDrag(CXyDC *pDC, CPoint point);
int HandleMouseHover(CDC *dc, CPoint point);
};
}; // namespace NItem