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

1 month ago
#pragma once
#include <memory>
#include "HandleDrawer.h"
#include "itemcurve.h"
namespace NItem {
#define DRAG_NODE_DEFAULT 0 // ֱ<><D6B1><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>ǰ<EFBFBD>ڵ<EFBFBD>
#define DRAG_NODE_LINE 1 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
#define DRAG_NODE_COS 2 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
#define DRAG_NODE_SPLINE 3 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
#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);
// <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>
int HitTestHandle(CPoint point);
void DeleteHandle(int nIndex);
int AddHandle(CPoint point);
BOOL IsCanAddHandle(CPoint point, double *pl0 = nullptr);
// <20><EFBFBD><E9BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>дΪ<D0B4><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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:
// Ĭ<>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
// <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual void OnDrawDragPreview() = 0;
virtual void OnCalculateDragEffect(CPointList *pList) = 0;
// <20><>SetPos<6F><73><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>m_pMarkCurve
virtual void OnModeInitialize() {}
// <20><>OnMouseMove<76>е<EFBFBD><D0B5><EFBFBD>
virtual void OnDragMove(int nIndex, CPoint2D pt) {}
// <20><>ȡ<EFBFBD><C8A1>ǰƫ<C7B0><C6AB>ģʽ<C4A3><CABD>Linear/Cosineģʽʹ<CABD>ã<EFBFBD>
int GetOffsetMode(void);
// <20><EFBFBD><E9BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>д
virtual int AddHandle(double l0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>
int AddHandle(CCurveEx *pValue, dfPoint add);
// <20><><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPoint2D c_down, c_last;
// <20>϶<EFBFBD><CFB6><EFBFBD>־
bool m_bLButtonDownWhenMouseMove;
// <20><><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>
std::unique_ptr<COne> m_pBakOne;
// <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::unique_ptr<HandleDrawer> m_handleDrawer;
// <20><><EFBFBD><EFBFBD>µ㣨<C2B5><E3A3A8>Ļ<EFBFBD><C4BB><EFBFBD>
CPoint m_nLButtonDownPoint;
// <20>µ<EFBFBD><C2B5>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
CPointList NewPointList;
// <20><>ʱ<EFBFBD><CAB1><EFBFBD>б<EFBFBD>
CPointList PointList;
// <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>ģʽ
DWORD m_nHandleDrawMode;
int m_nModeX;
int m_nModeY; // <20><><EFBFBD><EFBFBD>ģʽ
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