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.
kev/Drawer/Module/GeoSigmaDraw/CurveEditorSpline.h

145 lines
3.9 KiB
C

1 month ago
#pragma once
#include "CurveEditorBase.h"
1 month ago
#include "HandleDrawer.h"
#include "SplineCurveModel.h"
#include "SplineDragPipeline.h"
#include "SplineEditorRenderer.h"
1 month ago
#include <memory>
1 month ago
#include <vector>
1 month ago
1 month ago
/**
* @brief 线
1 month ago
*
1 month ago
* 使 Centripetal Catmull-Rom
* 线
1 month ago
*/
1 month ago
class CurveEditorSpline : public CurveEditorBase, public ISplineDragPipelineContext
{
1 month ago
public:
1 month ago
CurveEditorSpline(CSigmaDoc* pDoc);
1 month ago
1 month ago
virtual ~CurveEditorSpline(void);
1 month ago
1 month ago
// Mouse event handlers
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) override;
void Draw(CDC* pDC) override;
void DrawAssistant(CDC* pDC, int mouseX, int mouseY) override;
int GetNumberOfNode() override;
void EreaseHandles(CDC* pDC) override;
void EndEdit(void) override;
void CancelAll(void) override;
BOOL IsCanCancelAll(void) override;
// =========================
// 核心操作:控制点管理
// =========================
/**
* @brief
*/
void InitializeHandles(CCurveEx* pCurve);
1 month ago
1 month ago
/**
* @brief
*/
int HitTestHandle(CPoint point) override;
1 month ago
1 month ago
/**
* @brief
*/
void DeleteHandle(int nIndex) override;
1 month ago
1 month ago
/**
* @brief
*/
int AddHandle(CPoint point) override;
1 month ago
1 month ago
/**
* @brief
*/
BOOL IsCanAddHandle(CPoint point, double* pl0 = nullptr) override;
1 month ago
1 month ago
/**
* @brief 线
*/
CCurveEx* GetControlCurve(void) override;
void GetXY(CCurveEx* pValue, int nIndex, dfPoint& point) override;
void AttachProcess(CPointList& oldPoints, CPointList& newPoints) override;
void DrawMoveLine(void) override;
void GetMarkCurve(void) override;
CPoint2D GetCDown() const override;
CPoint2D GetCLast() const override;
protected:
void OnDrawDragPreview();
void OnCalculateDragEffect(CPointList* pList);
void OnDragMove(int nIndex, CPoint2D pt);
int AddHandle(double l0);
1 month ago
private:
1 month ago
SplineCurveModel m_splineCurveModel;
SplineDragState m_dragState;
std::unique_ptr<SplineDragPipeline> m_dragPipeline;
std::unique_ptr<COne> m_pBakOne;
std::unique_ptr<HandleDrawer> m_handleDrawer;
std::unique_ptr<SplineEditorRenderer> m_renderer;
DWORD m_nHandleDrawMode;
std::unique_ptr<CCurveEx> m_tempControlCurve;
void DrawHandle(CXyDC* pDC, CCurveEx* pCurve);
void DrawHandlesByCDC(CDC* pDC, CCurveEx* pCurve);
void DrawSelectHandle(int nHandle);
CRect GetRangeWidthIndex(int nIndex);
CRect GetFirstNodeHandleRectFocus(CPoint point);
int HitTestHandle(CCurveEx* pValue, CPoint point);
// =========================
// 核心操作:鼠标交互
// =========================
/**
* @brief
*/
bool IsDragging(int nFlags) const;
/**
* @brief
*/
int HandleMouseDrag(CXyDC* pXyDC, CPoint point);
/**
* @brief Hover
*/
int HandleMouseHover(CXyDC* pXyDC, CPoint point);
int AcquireDragHandle(CPoint point);
void ApplyDragAndRelease();
void RemoveCurrentHandle();
CSigmaDoc* GetDoc() override;
POSITION GetPos() override;
int GetHandleIndex() override;
void WriteModelToDocCurve() override;
void Invalidate() override;
/**
* @brief
*/
int FindSegmentIndexAtScreenPoint(CPoint screenPoint, dfPoint* pOutWorldPoint);
};