From 3628a707a38e1c590216c5983c9b97b9c742f86c Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期一, 24 三月 2025 09:01:42 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/EqsGraphWnd.h |  235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 235 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/EqsGraphWnd.h b/SourceCode/Bond/Servo/EqsGraphWnd.h
new file mode 100644
index 0000000..1c4ff41
--- /dev/null
+++ b/SourceCode/Bond/Servo/EqsGraphWnd.h
@@ -0,0 +1,235 @@
+#pragma once
+#include <functional>
+
+
+#ifndef EQSGRAPHWND_TAG
+
+#ifdef _WIN32
+
+#define EQSGRAPHWND_CLASSA		"EqsGraphWnd"
+#define EQSGRAPHWND_CLASSW		L"EqsGraphWnd"
+
+#ifdef UNICODE
+#define EQSGRAPHWND_CLASS		EQSGRAPHWND_CLASSW
+#else
+#define EQSGRAPHWND_CLASS		EQSGRAPHWND_CLASSA
+#endif
+
+#else
+#define EQSGRAPHWND_CLASS      "EqsGraphWnd"
+#endif
+
+
+#define EQSGRAPHWND_TAG			_T("EQSGRAPHWND_TAG")
+
+#define EQSGRAPHWND_FIRST		(0U-2890U)
+#define EQSGRAPHWND_LAST		(0U-2850U)
+#define EQSGRAPHWND_			(EQSGRAPHWND_FIRST - 1)
+
+
+#ifndef MIN
+#define MIN(X,Y) (((X)>(Y))?(Y):(X))
+#endif
+
+#ifndef MAX
+#define MAX(X,Y) (((X)>(Y))?(X):(Y))
+#endif
+
+typedef struct tagEQSGRAPHWND_NMHDR
+{
+	NMHDR		nmhdr;
+	DWORD		dwData;
+	DWORD		dwData1;
+	DWORD		dwData2;
+} EQSGRAPHWND_NMHDR;
+
+typedef struct tagEQITEM
+{
+	unsigned int id;
+	RECT rect;
+	char text[64];
+	BOOL bHighlight;
+	int nShowType;
+	DWORD_PTR pData;
+	DWORD_PTR pInPins;
+	DWORD_PTR pOutPins;
+	int nFlashFlag;
+} EQITEM;
+
+typedef struct tagPIN
+{
+	int nIndex;
+	int nType;
+	char text[64];
+	BOOL bHighlight;
+	EQITEM* pItem;
+	tagPIN *pConnectedPin;
+	POINT ptConnectedLine[6];
+	int nLinePtCount;
+	DWORD_PTR pData;
+} PIN;
+
+#define ITEM_NORMAL		0
+#define ITEM_SMALL		1
+#define ITEM_LARGE		2
+
+#endif
+
+typedef std::function<bool(PIN *pPin1, PIN *pPin2)> ONCONNECTPIN;
+typedef std::function<bool(PIN *pPin)> ONDISCONNECTPIN;
+typedef std::function<bool(EQITEM* pItem)> ONDELETEEQITEM;
+typedef std::function<void(EQITEM* pItem, int x, int y)> ONEQITEMPOSCHANGED;
+
+typedef struct _EqsGraphListener
+{
+	ONCONNECTPIN			onConnectPin;
+	ONCONNECTPIN		    onCheckConnectPin;
+	ONDISCONNECTPIN		    onDisconnectPin;
+	ONDELETEEQITEM			onDeleteEqItem;
+	ONEQITEMPOSCHANGED		onEqItemPosChanged;
+	ONDELETEEQITEM			onDblckEqItem;
+	ONDELETEEQITEM			onRclickEqItem;
+} EqsGraphListener;
+
+class CEqsGraphWnd
+{
+	typedef struct tagRECTF
+	{
+		float    left;
+		float    top;
+		float    right;
+		float    bottom;
+	} RECTF;
+
+public:
+	CEqsGraphWnd();
+	~CEqsGraphWnd();
+
+public:
+	static BOOL RegisterWndClass();
+	static CEqsGraphWnd* FromHandle(HWND hWnd);
+	void SetFrameColor(COLORREF color);
+	void SetBkgndColor(COLORREF color);
+
+public:
+	void EnableScroll(BOOL bEnable);
+	void EnableMultiSelect();
+	void SetItemRound(int nRound);
+	void SetDefaultItemBackgroundColor(COLORREF crNormal, COLORREF crSel);
+	void SetDefaultItemFrameColor(COLORREF crNormal, COLORREF crSel);
+	void SetDefaultItemTextColor(COLORREF crNormal, COLORREF crSel);
+	void SetOnListener(EqsGraphListener& listener);
+	BOOL SetCurSel(int nSel);
+	BOOL SetCurSel(CString strItemName);
+	BOOL SetCurSel(DWORD_PTR pData);
+	EQITEM * AddItem(int id, CString strText, DWORD_PTR dwData, int nType = ITEM_NORMAL);
+	void RemoveItem(EQITEM* pItem);
+	PIN * AddPin(EQITEM* pItem, int nType, CString strName, DWORD_PTR dwData);
+	int DeleteItem(EQITEM* pItem);
+	void DeleteAllItems();
+	void SetItemSelectState(int nIndex, BOOL bSelect);
+	void SetCurrentItem(EQITEM* pItem);
+	BOOL GetItemRect(EQITEM* pItem, LPRECT lpRect);
+	BOOL GetItemWarperRect(EQITEM* pItem, LPRECT lpRect);
+	BOOL GetInPinRect(EQITEM* pItem, int nPinIndex, LPRECT lpRect);
+	BOOL GetOutPinRect(EQITEM* pItem, int nPinIndex, LPRECT lpRect);
+	BOOL GetPinPoint(PIN *pPin, LPPOINT lpPoint);
+	EQITEM* GetItem(DWORD_PTR dwData);
+	PIN * GetPin(DWORD_PTR dwItemData, DWORD_PTR dwPinData);
+	int ConnectPin(DWORD_PTR dwItem1Data, DWORD_PTR dwPin1Data, DWORD_PTR dwItem2Data, DWORD_PTR dwPin2Data);
+	void SetItemText(EQITEM* pItem, CString strText);
+	void SetItemType(EQITEM* pItem, int type);
+	void SetItemPos(EQITEM* pItem, int x, int y);
+	void FlashItem(EQITEM* pItem);
+	void AnimationItem(EQITEM*pItem);
+
+private:
+	void Init();
+	void InitFont();
+	void Notify(int nCode, int dwData, int dwData1 = 0, int dwData2 = 0);
+	void Release();
+	void ReleaseItem(EQITEM* pItem);
+	void ReleaseAllItems();
+	void CalculateScollbar();
+	void CalculateMapPos();
+	void CalculateMagneticLine(EQITEM* pItem, LPRECT lprcItemRect, int &hoz, int &ver);
+	int HighTest(POINT pt, OUT EQITEM*& pItem, OUT PIN *& pPin);
+	int GetPinState(PIN *pPin);
+	void ClearConnectedLinePoint(EQITEM*& pItem);
+	void DrawMagneticLine(LPRECT lprcClient, int nHozLine1, int nHozLine2, int nVerLine1, int nVerLine2);
+	void DrawArrow(Gdiplus::Graphics *pGraphics, Gdiplus::Brush* pBrush, Gdiplus::Pen *pPen,
+		int x, int y, int nArrowLen);
+	void DrawDropItemRectangle(LPRECT lpRect1, LPRECT lpRect2);
+	void DrawPinConnectedLine(Gdiplus::Graphics *pGraphics, Gdiplus::Brush *pBrush, Gdiplus::Pen *pPen, LPPOINT lpPt1, LPPOINT lpPt2,
+		LPRECT lpRect1, LPRECT lpRect2, PIN *pOwnerPin);
+	void DrawPinWillConnectLine(COLORREF color, LPPOINT lpPt1, LPPOINT lpPt2);
+	double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2);
+	static CEqsGraphWnd* Hook(HWND hWnd);
+	static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+	static LRESULT OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
+	LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);
+	LRESULT OnTimer(WPARAM wParam, LPARAM lParam);
+	LRESULT OnNcPaint(WPARAM wParam, LPARAM lParam);
+	LRESULT OnPaint(WPARAM wParam, LPARAM lParam);
+	LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam);
+	LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam);
+	LRESULT OnRButtonDown(WPARAM wParam, LPARAM lParam);
+	LRESULT OnLButtonDblclk(WPARAM wParam, LPARAM lParam);
+	LRESULT OnMouseWheel(WPARAM wParam, LPARAM lParam);
+	LRESULT OnMouseHWheel(WPARAM wParam, LPARAM lParam);
+	LRESULT OnKeyDown(WPARAM wParam, LPARAM lParam);
+	LRESULT OnSize(WPARAM wParam, LPARAM lParam);
+	LRESULT OnVScroll(WPARAM wParam, LPARAM lParam);
+	LRESULT OnHScroll(WPARAM wParam, LPARAM lParam);
+	LRESULT OnNitify(WPARAM wParam, LPARAM lParam);
+
+private:
+	EQITEM*		m_pCurItem;
+	int			m_nFlashCount;
+	EQITEM*		m_pFlashItem;
+	EQITEM*		m_pAnimationItem;
+	PIN *		m_pCurPin;
+	PIN *		m_pSelLineOutPin;		// 选中的连线的两个pin中的out pin
+
+private:
+	HWND		m_hWnd;
+	COLORREF	m_crBkgnd;
+	COLORREF	m_crFrame;
+	HFONT		m_hFontTitle;
+
+private:
+	BOOL m_bUseGdiPlus;					// 使用GDI+绘图?
+	COLORREF m_crItemBackground[2];		// item的颜色,normal, active
+	COLORREF m_crItemFrame[2];			// item的边框,normal, active
+	COLORREF m_crItemNameText[2];
+	COLORREF m_crItemIdText[2];
+	COLORREF m_crPinBkgnd[3];			// pin的颜色,normal, active, enable connect
+	int m_nCurSel;
+	EqsGraphListener m_listener;
+	CPtrArray m_arItem;
+	BOOL m_bMultiSelect;
+	int m_nItemRound;
+
+private:
+	int m_nStageCx;			// 画布大小
+	int m_nStageCy;
+	int m_nOffsetX;
+	int m_nOffsetY;
+
+	// 动画
+	RECTF m_rcAnimation;
+	RECTF m_rcAninationStep;
+	int m_nAninationStep;
+	int m_nAninationDuration;		// ms
+
+	// 字体
+	HFONT m_hFontName;
+	HFONT m_hFontId;
+
+private:
+	HWND m_hWndMapPos;
+	BOOL m_bEnableScroll;
+	int m_nMagneticLinHoz;
+	int m_nMagneticLinVer;
+};
+

--
Gitblit v1.9.3